快速排序

  我用自己的语言来阐述快速排序.希望没有基础的人也能看懂.

  快速排序的主要是思想是:

  1.找个参考数,把比它大的数放到右边,比它小的数放到左边;

  2.递归

  

  关于找参考数,没有比较死的规定,一般取第一个,也可以取其它的,比如中间的数.

  代码如下,注释比较详细.

代码:

#include<stdio.h>
#include<stdlib.h>

void q_sort(int a[], int startIndex, int endIndex);

int main(int argc, char **argv)
{
    int i;
    int a[] = {3,1,4,7,11,2};
    
    printf("排序之前:\n");
    for(i = 0; i < 6; ++i)
    {
        printf("%d ", a[i]);
    }
    printf("\n");

    q_sort(a, 0, 5);
    
    printf("排序之后:\n");
    for(i = 0; i < 6; ++i)
    {    
        printf("%d ", a[i]);
    }
    printf("\n");
    
    exit(0);
}

void q_sort(int a[], int startIndex, int endIndex)
{
    int midOne = a[startIndex];//选第一个作为参考点
    int i = startIndex, j = endIndex;
    if(i < j)//这个判断是递归结束的依据,不加的话会导致堆栈溢出
    {
        while(i < j)
        {
            for(; i < j; j--)
            if(a[j] < midOne)//小于参考点的数移到左边
            {
                a[i++] = a[j];
                break;
            }
            for(; i < j; i++)
            if(a[i] > midOne)//大于参考点的数移到右边
            {
                a[j--] = a[i];
                break;
            }
        }
    
        a[i] = midOne;//参考点归位

        //把参考点左右的部分分别进行快排
        q_sort(a, startIndex, i - 1);
        q_sort(a, i + 1, endIndex);
    }
}

 

输出结果:

排序之前:
3 1 4 7 11 2 
排序之后:
1 2 3 4 7 11 

 

快速排序的时间复杂度:平均O(n*log(n)),最坏O(n^2);

快速排序的空间复杂度:平均O(logn),最坏O(n)

 

posted @ 2014-12-02 21:00  开开甲  阅读(470)  评论(0编辑  收藏  举报