快速排序

快速排序是数据结构非常经典的一个排序算法,它是在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;
}

 

上一篇:0006 c语言 输入入门(2)


下一篇:0007 计算球的体积 c语言