C语言实现快速排序算法

快速排序C语言实现与分析

快速排序是C.A.R.Hoare于1962年发明的。

算法的基本思想是:递归。
对于一个给定的数组,从中任意选取一个元素,以这个元素为界,
将其余元素划分为两个子集,一个子集要求全部小于这个元素,另一个子集要求全部
大于或等于这个元素。对这两个子集递归执行这个过程,当某个子集中的元素个数
小于2时,终止递归。

1.算法分析

递归思想在C语言程序设计中,比较独特,并不推荐使用,但其能产生十分紧凑的代码
。各个大厂,百度,阿里,腾讯等均钟情于快速排序,可见这个算法的不平庸之处。
在数组排序时,任意选取一个元素,一般选取第一个元素。将数组分成两个子集,
以这个元素为界,左边的子集小于这个元素,右边的子集大于这个元素。如何实现
这个设想呢?很简单了,只需要把每一个元素都与这个元素比较一下,小于这个元
素的“依次”排在左边,大于等于的元素自然就拍到了右边。然后左边的子集调用
一次该函数,右边的子集调用一下该函数。

2.函数实现

在排序过程中,需要频繁比较和调换数组内两个元素的位置,
我们这里设计一个交换两个元素的函数,十分简单。
调用该函数能够交换arry数组中,位置i和位置j的两个元素。
i和j是数组内任意的下标。

void swap(uint16_t *arry, uint8_t i, uint8_t j)
{
    uint16_t temp; 
    temp = *(arry + i);
    *(arry + i) = *(arry + j);
    *(arry + j) = temp;
}

排序过程,如下代码:

int sortq(uint16_t *arry, int left, int right)
{
    uint16_t temp;
    int i;
    if (left >= right) {
        return -1;
    }
    
    temp = left;
    
    for (i = left + 1; i <= right; i++) {
        if (arry[i] < arry[left]) {
            swap(arry, ++temp, i);
        }
    }

    swap(arry, left, temp); 
    sortq(arry, left, temp-1);
    sortq(arry, temp+1, right);
}

主函数中,直接调用该函数,实现如下:

#include <stdio.h>
#include <stdint.h>
#include <stddef.h>

int main(int argc, const char *argv[])
{
    uint16_t data[10] = {23,1,4,7,8,23,9,0,2,2};
    int data_len = 10;
    
    sortq(data, 0, 9);
   
    printf("data is:"); 
    while (data_len-- > 0) {
        printf("%x\t",data[data_len]);
    }
    printf("\n");
    return 0;
}

3.总结分析

快速排序函数选取数组第一个元素作为排序分界元素,
然后用第二个元素到最后一个元素,依次与分界元素比较
如果找到任意一个小于分界元素的对象,则将这个对象从第二个
位置开始交换,每找到一个对象,就交换一下,于是有了++temp
操作。temp是小于分界元素的最后一个对象。而不是第一个大于
等于分界元素的对象。这一点跟满空栈概念一致。经过一轮交换
后,递归调用左右子集的交换,直到小于2个元素的子集出现,
则终止该子集。
该算法选取分界元素时,当选取到最小或者最大的元素时,会
花费最常的时间,等于其他算法。所以存在不确定性。
其效率是:O(N*logN) 在所有相同效率模型的算法中,其效率
最高。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章