C++实现快速排序

来源:互联网 发布:sql 比较运算符 编辑:程序博客网 时间:2024/05/22 10:53

#include <iostream>using namespace std;int a[1005];int temp;int Partition(int a[],int low,int high){    int i=low,j=high,pivot=a[low];  //用序列的第一个元素作为基准元素    while(i<j){                 //从序列的两端交替向中间扫描,直至i等于j为止        while(i<j&&a[j]>=pivot)            j--;        if(i<j)   //表示找到了<prvot的元素        swap(a[i++],a[j]);        while(i<j&&a[i]<=pivot)            i++;        if(i<j)   //表示找到了>prvot的元素        swap(a[i],a[j--]);    }    return j;   //返回 i==j的那个结点}void QuickSort(int a[],int low,int high){  //对a[low,high]快速排序'    //cout<<"low :"<<low<<"high:"<<high<<endl;    int prvotpos;    if(low<high){   //仅当区间长度大于1时才排序        prvotpos=Partition(a,low,high);  //对a[low,high]做划分        //递归对左区间和右区间进行排序        QuickSort(a,low,prvotpos-1); //对左区间递归排序        QuickSort(a,prvotpos+1,high); //对右区间进行排序    }}int main(){    int n;    cin>>n;    for(int i=0;i<n;i++){  //初始化数组        cin>>a[i];    }    QuickSort(a,0,n-1);    for(int i=0;i<n;i++){        cout<<a[i]<<' ';    }}

分治法实现快排过程详解

45

23

65

57

18

2

90

84

12

76

i

 

 

 

 

 

 

 

 

j


序列的第一个元素是基准元素:

所以45是基准元素pivot=45

从右向左进行比较,如果大于privot,j--,直到找到a[j]<privot, i++a[i],a[j]交换位置因为12<45所以下面进行交换

45

23

65

57

18

2

90

84

12

76

i

 

 

 

 

 

 

 

 

j


12

23

65

57

18

2

90

84

45

76

 

i

 

 

 

 

 

 

j

 


接下来从左向右进行比较,如果小于privot=45i++,直到找到a[i]>privot=45,a[i]a[j]交换位置,因为23<45,i++,i直65,65>45开始交换,j减1

12

23

65

57

18

2

90

84

45

76

 

i

 

 

 

 

 

 

j

 


12

23

45

57

18

2

90

84

65

76

 

 

i

 

 

 

 

j

 

 


接下来从右向左开始比较,84>privot=45,所以j--,继续查找小于45的,找到了2,所以j指向2所在的位置,开始进行交换,i++

12

23

45

57

18

2

90

84

65

76

 

 

i

 

 

j

 

 

 

 


12

23

2

57

18

45

90

84

65

76

 

 

 

i

 

j

 

 

 

 


接下来从左边开始比较,
57>privot=45,所以a[i]a[j]开始交换,并且j--,交换结果:

12

23

2

45

18

57

90

84

65

76

 

 

 

i

j

 

 

 

 

 


接下来从右边开始比较,
a[j]=18<45,a[i]a[j]开始交换,并且i++,交换以后结果

12

23

2

18

45

57

90

84

65

76

 

 

 

 

i  j

 

 

 

 

 


此时
i==j  不满足循环条件i<j,所以跳出循环,return j=4


然后以45为界限左边是比45小的,右边是比45大的,所以继续分成两部分再进行比较

左边部分

12

23

2

18

 

 

 

 


右边部分

57

90

84

65

76

 

 

 

 

 


12

23

2

18

 

 

 

 


左边部分开始循环

此时基准元素是第一个12,所以privot=12,由于18>12所以j--,

12

23

2

18

i

 

 

j


12

23

2

18

i

 

j

 


从右向左开始
,18>12,所以j--,j指向2,然后2<12,开始交换,然后i++,交换后结果:


2

23

12

18

 

i

j

 


从左向右开始比较,23>12,所以开始交换,然后j--,交换结果:

2

12

23

18

 

i   j

 

 


由于
i==j所以循环结束,跳出循环

右边部分也是同样道理实现的,然后一直分治下去。

我整了好长时间又是困在了递归上面,所以,递归这一块还需要多多理解。

0 0
原创粉丝点击