快速排序 C&&C++
快排算法
快排和冒泡都是基于交换的思想,但是进行了改进,更为高效。
流程:
(1)首先设定一个分界值,通过分界值将数组分成左右两部分。
(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。
(3)左右两个部分重复上述排序。
从上述流程可以看出,这就是一个递归的过程,递归终止即只有一个元素
1 #include<iostream> 2 #include<ctime> 3 #include<cstdlib> 4 using namespace std; 5 void QuickSort(int *a,int left,int right) 6 { 7 int rt,lt,t,base; 8 rt=right; //rt为基准分组后的左半部分上边界 9 lt=left; //lt为基准分组后的右半部分的下边界 10 base=a[left]; 11 /*这里定义分界值,这个分界值定在哪里都是可以的,定在中间更为直观,若定在其他地方,手动排一下就知道,边界值会换到中间去,和定在中间一个样*/ 12 while (lt < rt) 13 { 14 while(a[lt] < base) lt++; //从左边开始寻找大于分界值的值 15 while(a[rt] > base) rt--; //从右边开始寻找小于边界值的值 16 if(lt < rt) 17 { /*lt小于rt,就交换这两个的值,lt与rt必不会在边界值同一侧, 18 手动按照算法排一下就知道,lt或rt到了边界值的时候就会停下来,交换的时候就会把边界值换到中间去了*/ 19 t = a[lt] ; 20 a[lt] = a[rt] ; 21 a[rt] = t ; 22 lt++; 23 rt--; 24 } 25 } 26 while(a[lt]<base) lt++; //因为右半部分可能还到不了下边界,所以需要继续递增 27 while(a[rt]>base) rt--;//因为左半部分可能还到不了上界,所以需要继续递减 28 if(lt == rt) lt++; //此处为了避免两个边界模糊不清 29 if( left < rt ) QuickSort(a,left,rt); //递归对左半部分快排 30 if( right > lt) QuickSort(a,lt,right); //递归对右半部分快排 31 32 } 33 int main() 34 { 35 srand(time(NULL)); 36 int n; 37 cout<<"Please cin the size of array:"<<endl;//输入数组的大小 38 cin>>n; 39 int a[n]; 40 cout<<"Array before sorting is:"<<endl; 41 for (int i = 0; i < n; i++) 42 { 43 a[i]=rand()/1000; //随机数作为数组输入 44 cout<<a[i]<<" "; 45 } 46 cout<<endl; 47 QuickSort(a,0,n-1); 48 cout<<"Array after sorting is:"<<endl; 49 for (int i = 0; i < n; i++) cout<<a[i]<<" "; 50 cout<<endl; 51 return 0; 52 }