标签:就是 经典 temp clu ++ body 治法 步骤 div
快速排序是数据结构非常经典的一个排序算法,它是在1962年hoare开发的,快速排序用的也是分治的思想。下面来分析一个具体的例子吧。
有这样一个序列,我们用分治法的思想就是要找到一个基准值,进行第一次快速排序之后,这个基准值的左边都比它小,这个基准值的右边都比他的值要大,很显然这个基准值已经将这个序列分成了两个部分,然后递归再在两边分别进行同样的步骤,这个就是快速排序的思想。
a[7]={4,2,6,3,1,7,5};
4 | 2 | 6 | 3 | 1 | 7 | 5 |
如何进行呢?一般都是以第一个元素为基准值,设置两个值i,j,i=0,j=n-1然后j从这个序列的最后面找到一个比基准值小的数,然后让这个数和基准值交换,即a[i]和a[j]交换知道i=j时,也就是基准值的左右两边已经相等了,下面来实际的走一下吧。
第一次:
初始化:i=0,j=6,key=4;//key代表基准值
① 从后边找一个比key小的数交换
i=0,j=4,key=4;即找到了a[4],a[0]和a[4]交换;
1 | 2 | 6 | 3 | 4 | 7 | 5 |
②然后再从前面开始找一个比key大的数
i=2,j=4,key=4;a[2]和a[4]交换
1 | 2 | 4 | 3 | 6 | 7 | 5 |
③从后找一个比key小的数
i=2,j=3,key=4;a[2]和a[3]交换
1 | 2 | 3 | 4 | 6 | 7 | 5 |
④然后再从前面找一个比key大的值,
i=3;j=3,key;
因为i已经等于j了,所以第一次快速排序已经结束了,再看看我们的key=4,4的左边都是比它小的,4的右边都是比它大的。
第二次会被key分成两部分,左边和右边在进行第一次的步骤,一直递归下去,直到整个序列有序。
下面把参考代码贴在下面
#include<iostream>
using namespace std;
void qsort(int a[],int low,int high)
{
if(low>=high) return ;
int i=low;
int j=high;
int key=a[low];
int temp;
while(i<j){
while(i<j&&key<=a[j]){
j--;
}
temp=a[i];
a[i]=a[j];
a[j]=temp;
while(i<j&&key>=a[i]){
i++;
}
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
qsort(a,low,i-1);
qsort(a,i+1,high);
}
int main()
{
int n;
cin >> n;
int a[n];
for(int i=0;i<n;i++){
cin >> a[i];
}
qsort(a,0,n-1);
for(int i=0;i<n;i++){
cout << a[i] << ‘ ‘;
}
return 0;
}
标签:就是 经典 temp clu ++ body 治法 步骤 div
原文地址:https://www.cnblogs.com/sddr/p/10830434.html