快速排序 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 }

 

 

 

posted @ 2019-11-28 11:56  Cyber_8086_hyj  阅读(207)  评论(0编辑  收藏  举报