快速排序算法思想及示例(C语言实现)

一、主要思想

快速排序的主要思想是分治法,也就是把问题分解成若干个小问题求解,然后把小问题的解合成问题的解。快速排序的算法步骤如下;
①从数列中取出一个数作为基准数;
②把所有小于基准数的全部挪到左边,把所有大于基准数的全部挪到右边;
③对基准数左右两部分分别重复步骤①和②。
一次基本步骤的演示过程:
原始数列:
在这里插入图片描述

①取第一个数作为基准数,用临时变量x记录下来,x=56
②用i,j分别从数列头和尾遍历数列,初始化时i=start(开始位置),j=end(结束位置)
(如果start >= end 直接return,不再执行以下步骤)
在这里插入图片描述
③j开始向左遍历,直到遇到一个比基准数小的数或者遇上i
在这里插入图片描述
如果是直到遇到一个比基准数小的数,把j指向的数移动到i指向的地址
在这里插入图片描述
i向右移动一位
在这里插入图片描述
⑤i向右遍历数列直到遇到一个比基准数大的数或者与j相遇,如果是遇到一个比基准数大的数,把它移动到j指向的地址
在这里插入图片描述
j向左移动一位
在这里插入图片描述
⑥重复以上步骤,直到i和j相遇,本例中i和j相遇时如下
在这里插入图片描述
然后把基准数56挪到i指向的地址中,这样56的最终位置就确定了。
在这里插入图片描述
⑦对基准数左边和右边的数列分别递归执行上述步骤,即可完成排序,时间复杂度是O(nlog2n)

二、示例代码

#include <stdio.h>

void sort(int* N,int start,int end){
    if(start >= end) return;
    int i = start;
    int j = end;
    int x = N[start];
    while(i < j){
        while(j > i && N[j] > x) j--;
        if(j > i){
            N[i] = N[j];
            i++;
        }
        
        while(j > i && N[i] < x) i++;
        if(j > i){
            N[j] = N[i];
            j--;
        } 
    }
    N[i] = x;
    if(start < i - 1)
        sort(N,start,i - 1);
    if(end > i + 1)
        sort(N,i + 1,end);
}


int main(int argc, char **argv)
{
    int N[6] = {6,5,4,3,2,1};
    sort(N,0,5);
    for(int i = 0; i < 6; i ++){
        printf("%d",N[i]);
        if(i != 5) printf(",");
    }
    return 0;
}

运行结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值