• 数据结构--快速排序


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

     

  • 相关阅读:
    第九周PSP
    c++的继承方式
    matlab的应用
    beta发布的评论
    本周psp
    历年作品点评
    JSON解析数据
    每周工作量及代码统计(第七周)
    词频统计(WEB)版
    评论alpha发布
  • 原文地址:https://www.cnblogs.com/sddr/p/10830445.html
Copyright © 2020-2023  润新知