十大排序算法-快速排序 c语言实现

 介绍

        快速排序(Quick Sort)是一种高效的排序算法,其基本思想是通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

快速排序算法的实现原理:

  1. 选择一个基准元素,通常选择第一个元素或者最后一个元素。
  2. 将比基准元素小的元素放到基准元素的左边,将比基准元素大的元素放到基准元素的右边,这个过程称为划分。
  3. 对基准元素左边的元素和右边的元素分别进行递归排序。

代码实现

#define PTR_MATH(base,i,width) ( ((char*)base) + (i)*width )

        这是一个C语言的宏定义,用于实现指针的数学运算。它的目的是简化指针的偏移量计算,提高代码的可读性和可维护性。这个宏定义的实现原理是,通过将指针与一个整数相加,实现指针的偏移量计算。其中,base 是原始指针,i 是偏移量,width 是指针宽度。

//快速排序
void quickSortRecursive(void* base, int left, int right ,int width, int(*compare)(const void* e1, const void* e2),void* temp){

    if(left>=right)
        return;

    int left_index=left;
    int right_index=right;

    //左边第一个元素作为中间元素
    memcpy(temp,PTR_MATH(base,left,width),width);

    char isleft=0;
    while(left_index!=right_index){
            
        if(isleft==0){
            //再右边找到大于中间元素的值,替换左边空位
            if(compare(PTR_MATH(base,right_index,width),temp)<0){
                memcpy(PTR_MATH(base,left_index,width),PTR_MATH(base,right_index,width),width);
                left_index++;
                isleft=1;
            }else{
                right_index--;
            }
        }
        else{
            //再左边找到小于中间元素的值,替换右边空位
            if(compare(PTR_MATH(base,left_index,width),temp)>=0){
                memcpy(PTR_MATH(base,right_index,width),PTR_MATH(base,left_index,width),width);
                right_index--;
                isleft=0;
            }else{
                left_index++;
            }
        }

    }
    //将中间元素放入空位
    memcpy(PTR_MATH(base,left_index,width),temp,width);

    quickSortRecursive(base,left,left_index,width,compare,temp);
    quickSortRecursive(base,right_index+1,right,width,compare,temp);
    
}

void quickSort(void* base, int len,int width, int(*compare)(const void* e1, const void* e2)){
    if(base==NULL||compare == NULL||width<=0||len<=1)
        return;

    void * temp = malloc(width);
    if(temp == NULL)
        return;

    quickSortRecursive(base,0,len-1,width,compare,temp);
    
    free(temp);
}

图解

总结

        快速排序是一种不稳定排序算法,在某些情况下,可能会产生最坏情况,即时间复杂度为O(n^2)。为了避免这种情况,可以采用随机化的方式选择基准元素,或者使用其他更高效的排序算法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值