导航

快速排序算法

Posted on 2018-08-23 15:59  困或  阅读(174)  评论(0编辑  收藏  举报

1.快速排序的思想

  给第一个元素找到在数组中的位置,这个位置就是这个元素最终在数组中的位置,然后给这个元素左右两侧进行递归排序。

2.代码

#include <stdio.h>

void Qsort(int a[], int low, int high)
{
    if(low >= high)
        return;
    
    int first = low;
    int last = high;
    int key = a[first];
 
    while(first < last){
        while(first < last && a[last] >= key)
            --last;
 
        a[first] = a[last];
 
        while(first < last && a[first] <= key)
            ++first;
         
        a[last] = a[first];    
    }
    
    a[first] = key;

    Qsort(a, low, first-1);
    Qsort(a, first+1, high);
}

int main()
{
    int a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24};
 
    Qsort(a, 0, sizeof(a) / sizeof(a[0]) - 1);
 
    for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
        printf("%d\n", a[i]);
     
    return 0;
}

   代码说明:

    [1]把第一个值作为key,并保存下来,此时数组第一个位置就空出来了。

    [2]之后进入循环,每个循环:首先从后往前找,找到小于key的,放到空出的位置,此时当前的位置就空出来了。然后从前往后找,找到大于key的,则放到空出的位置,此时当前的位置就空出来了。

    [3]把key放到当前空出的位置,这个位置就是key最终在数组的位置。

    [4]递归排序key左右两侧数组。

  总结:

    整个思想就是留一个空位置(第一个位置),之后从前往后,从后往前跟key比较之后,移动值到这个空位置,最后first>=last时,此时,空位置的左侧都小于key,而右侧都大于key,所以把key放到当前的空位置。