Qsort快速排序

快速排序----在无序的数组中,任意定义一个中间值称为pivot,一般情况下选择

mid number=(left+right)/2,然后和左端或者右端的值进行交换,然后再开始每一个元素与其比较。分别用数组的两个下标来来表达处理的进程,i是判断过大小的数,past是临时分界点,past左边都是比pivot小的数,右边在i不是最后一个数前,是不确定的。当i到达right也就是最后一个判断值之后,past的右边包括past就都是比pivot大的数。对于等于pivot的数不做判断,在左边或者右边没有影响。这时把pivot和past交换,这样pivot的左边都是比他小或等于它的,右边就是等于或大于他的。 在对左边进行排序,在对右边进行排序就可以了。

需要注意的是在用for 进行检查的时候i = 0是不对的,必须要i=left来确保判断区间的正确!!


#include <stdio.h>
#include <ctype.h>
void q_sort(int v[], int left, int right);
void swap(int v[], int i, int j);
int main(void)
{
    int num[10] = {3,3,2,1,23,3,1,5,1,44};;
    q_sort(num, 0, 9);
    for(int i = 0 ; i < 10 ; i++)
       printf("%d ",num[i]);

}
void q_sort(int v[], int left, int right)
{
   
    //当子集里面只有一个值得时候,退出排序
    if(left >= right)
    {
        return;
    }
    int i, pivot, last;
    //把pivot中间比较值设定为最右边的值
    pivot = right;
    //指针指向一个初始不确定的值,如果有数比比较值小就和这个指向的值交换
    last = left;
    for(i = left ; i <= right ; i++)
        if(v[i] < v[pivot])
            swap(v, i, last++);

    swap(v, pivot, last);
    //中间值左边继续排序
    q_sort(v, left, last-1);
    //中间值右边继续排序
    q_sort(v, last+1, right);
}
void swap(int v[], int i, int j)
{
    int temp;
    temp = v[i];
    v[i] = v[j];
    v[j] = temp;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值