码迷,mamicode.com
首页 > 编程语言 > 详细

快速排序

时间:2017-10-21 22:30:10      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:第一次用   第一个   namespace   不用   第k大   style   比较   color   技术   

原创、转载请注明出处。

 

快速排序优点

速度快,不需要辅助空间。

 

分治

划分问题:把数组的各个元素重排后分成左右2部分,使得左边任意元素都小于或等于右边任意元素。

递归求解:把左右2部分分别排序。

合并问题:不用合并,因为此时数组已经完全有序。

 

“划分过程”有多个版本,我第一次用的把第一个数作为基准,从前向后和从后向前分别找1个(找2个),交换。在处理细节时很麻烦,出了很多问题,后来用了找一个就交换的方法,个人感觉细节问题较少,代码如下:

 

#include<iostream>
using namespace std;

void print(int A[], int x, int y)//输出A[x,y]
{
    for(int i = x; i <= y; i ++)
    {
        cout << A[i] <<  ;
    }
    cout << endl;
}

void f(int A[], int x, int y)//把[x,y]划分成左右2个序列(不包括mid)
{
    if(x >= y)
    {
        return ;
    }
    int i = x, j = y, flag = 0, mid;//flag是0代表基准数下标是i,1代表基准数下标是j
    while(i != j)
    {
        if(A[i] > A[j])
        {
            swap(A[i], A[j]);
            flag = 1 - flag;
            if(flag)//基准数下标是j,i右移
            {
                i ++;
            }
            else//基准数下标是i,j左移
            {
                j --;
            }
        }
        else//不交换
        {
            if(flag)
            {
                i ++;
            }
            else
            {
                j --;
            }
        }
    }
    mid = i;//i = j
    f(A, x, mid - 1);
    f(A, mid + 1, y);
}

int main()
{
    int n, A[1000];
    cin >> n;
    for(int i = 0 ; i < n ; i ++)
    {
        cin >> A[i];
    }
    f(A, 0, n-1);
    print(A, 0, n-1);
    return 0;
}

 技术分享20

6 1 5 4 8 3 9 12 51 11 15 14 13 25 69 47 56 74 26 78

 

快速选择问题:

输出一个序列排序后第k大的数。借鉴快速排序的思想,序列分成2个左右2个序列后,可以根据第一序列的长度和k比较来确定是在左序列还是在右序列找。

 

快速排序的时间复杂度为:最坏情况O(n2),平均情况O(nlongn),但实践中几乎不可能达到最坏的情况,效率非常高。根据快速排序思想,可以在平均O(n)时间内选出数组中第k大的元素。

 

快速排序

标签:第一次用   第一个   namespace   不用   第k大   style   比较   color   技术   

原文地址:http://www.cnblogs.com/mu-ye/p/7705690.html

(0)
(0)
   
举报
评论 一句话评论(0
0条  
登录后才能评论!
© 2014 mamicode.com 版权所有 京ICP备13008772号-2
迷上了代码!