数据结构之快速排序
来源:互联网 发布:java英语词汇 编辑:程序博客网 时间:2024/06/07 12:56
只有比别人更早、更勤奋地努力,才能尝到成功的滋味
快速排序算法是冒泡排序算法的改进,与冒泡排序类似,快速排序也是通过交换逆序元素来进行排序的。不同的是,冒泡排序的交换是相邻的,而且快速排序一次交换就可以消除多个逆序元素。
它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
首先对于一无序数组a:50,30,20,65,44,85,60,55(并将其编号为0-7,);
我们首先需要选定一个关键字pivotkey = a[0]=50;
然后将这个关键字与这个数组两端的数相比较,并逐渐往中间搜索。
最好用动手在纸上推导一番就很容易了(ノ*・ω・)ノ
排序流程:
1、首先a[high]=a[7]=55>pivotkey=50;所以我们不需要变动a[7]的数字,然后使得high--;
2、再用a[6]与pivotkey比较;由于a[6]=60>pivotkey=50,所以我们不需要变动a[6]的数字,然后使得high--;
3、此时high=5;所以再用a[5]与pivotkey比较;由于a[5]=85>pivotkey=50,所以我们不需要变动a[5]的数字,然后使得high--;
4、此时high=4;所以再用a[4]与pivotkey比较;由于a[4]=44<pivotkey=50,所以我们需要交换a[4]与a[low]的两个数,因为此时low=0;所以交换后a[4]=50;a[0]=44;
5、这个时候要看a[low]端开始与pivotkey进行比较,首先a[low]=a[0]=44<pivotkey=50;所以我们不需要变动a[0]的数字,然后使得low++;
6、再用a[1]与pivotkey比较;由于a[1]=30<pivotkey=50,所以我们不需要变动a[1]的数字,然后使得low++;
7、此时low=2;所以再用a[2]与pivotkey比较;所以我们不需要变动a[1]的数字,然后使得low++;
8、此时low=3;所以再用a[3]与pivotkey比较由于a[3]=65>pivotkey=50,所以我们需要交换a[3]与a[high]的两个数,因为此时high=4;所以交换后a[4]=65;a[3]=50;
9、再次循环,由于a[3]<a[4],执行上述1-8后,得到low=high=3;
10、可以得到第一轮排序结果为 {44,30,20,}50,{65,85,60,55},可以得到两个部分,再分别进行上述操作,就可以得到最终结果。
程序如下:
#include <stdio.h>#include <stdlib.h>void swap(int *a,int *b){ int tmp; tmp=*a; *a=*b; *b=tmp;}int partition(int a[],int low,int high){ int i; int pivotkey=a[low]; while(low<high) { while(low<high&&a[high]>=pivotkey) high--; swap(&a[low],&a[high]); while(low<high&&a[low]<=pivotkey) low++; swap(&a[low],&a[high]); } printf("\n"); for(i=0; i<8; i++) printf("%4d",a[i]); printf("\n"); return low;}void QuickSort(int a[],int low,int high){ int pivot; if(low<high) { pivot=partition(a,low,high); QuickSort(a,low,pivot-1); //关键点左边的部分 QuickSort(a,pivot+1,high); //关键点左边的部分 }}int main(){ int i; int a[8]= {50,30,20,65,44,85,60,55}; QuickSort(a,0,7); printf("\n最终排序结果为:"); for(i=0; i<8; i++) printf("%4d",a[i]); return 0;}
结果:
2、根据输入整型数组和排序标识,对其元素按照升序或降序进行排序
#include<iostream>#include<algorithm>#include<vector>#include<string>using namespace std;//bool compUp(int a, int b)//{// return a < b; //升序排列,如果改为return a>b,则为降序//}////bool compDown(int a, int b)//{// return a > b;//}void quickSortUp(vector<int> &arr,int l,int h){ int low = l; int high = h; int key = arr[low]; if(low<high) { while(low<high) { while(low<high&&arr[high]>=key) { high--; } arr[low] = arr[high]; while(low<high&&arr[low]<=key) { low++; } arr[high] = arr[low]; } arr[low] = key; quickSortUp(arr,l,low-1); quickSortUp(arr,low+1,h); }}void quickSortDown(vector<int> &arr,int l,int h){ int low = l; int high = h; int key = arr[low]; if(low<high) { while(low<high) { while(low<high&&arr[high]<=key) { high--; } arr[low] = arr[high]; while(low<high&&arr[low]>=key) { low++; } arr[high] = arr[low]; } arr[low] = key; quickSortDown(arr,l,low-1); quickSortDown(arr,low+1,h); }}void sortArray(vector<int> intArray,int flagSort){ int len = intArray.size(); int low = 0; int high = len-1; /*快排*/ if(flagSort == 0) quickSortUp(intArray,low,high); else { quickSortDown(intArray,low,high); } /*冒泡*/// if(flagSort==0)// {// for(int i=0; i<len-1; i++)// {// for(int j=i+1; j<len; j++)// {////// if(intArray[j]<intArray[i])// {// int temp = intArray[j];// intArray[j] = intArray[i];// intArray[i] = temp;// }// }// }// }// else// {// for(int i=0; i<len-1; i++)// {// for(int j=i+1; j<len; j++)// {// if(intArray[j]>intArray[i])// {// int temp = intArray[j];// intArray[j] = intArray[i];// intArray[i] = temp;// }// }// }// } /*sort函数调用*/// if(flagSort==0)// {// sort(intArray.begin(), intArray.end(), compUp);// }// else// {// sort(intArray.begin(), intArray.end(), compDown);// } for(int i=0; i<len-1; i++) { cout<<intArray[i]<<" "; } cout<<intArray[len-1]<<endl;}int main(){ int n; while(cin>>n) { int flagSort = 0; vector<int> integerArray; integerArray.clear(); for(int i=0; i<n; i++) { int temp; cin>>temp; integerArray.push_back(temp); } cin>>flagSort; //0:升序,1:降序 sortArray(integerArray,flagSort); } return 0;}
- 数据结构之快速排序
- 数据结构之快速排序
- 数据结构之------快速排序
- 数据结构之快速排序
- 数据结构之快速排序
- 数据结构之快速排序
- 数据结构之快速排序
- 数据结构之快速排序
- 数据结构之快速排序
- 数据结构之快速排序
- 数据结构之快速排序
- 数据结构之快速排序
- 数据结构之快速排序
- 数据结构之快速排序
- 数据结构之快速排序
- 数据结构之快速排序
- 数据结构之快速排序
- 数据结构之快速排序
- 关于ros提到的那只turtle
- 虚幻4 文档翻译<一> Casting节点
- JAVA---构造函数和构造代码块 finally块
- Android中Bitmap,byte[],Drawable,InputStream相互转化工具类
- Fragment onActivityResult 无效的问题
- 数据结构之快速排序
- 关于public定义方法和类的作用,以及包和import语句
- Unity Editor 编写unity插件类
- JAVA文件操作之默认字符集编码
- 6174的问题
- 对于宽字符的初步运用
- 我为什么要写blog
- Activiti学习笔记三-开发部署bpmn流程文件
- 欢迎使用CSDN-markdown编辑器