C语言实现----快速排序

1.快速排序是一种交换排序

2.基本思想:

        选取一个基准数;

        然后将大于和小于基准的元素分别放置于基准数两边;

        继续分别对按此方法分治基准数的两侧,直至整个序列有序。

3. 注意问题

        基准数的选择(通常选取头元素或者尾元素)

        元素的查找(一组一组的查找需要交换的元素)

        递归调用(终止递归的临界条件)

        基准数的归位(查找相遇的位置和基准元素互换)

4. 元素查找的先后顺序(以升序为例):

        如果基准数选取为array[low],那么必须先从高位high查找到小于基准的数,然后再从低位low寻找大于基准的数,交换;

        如果基准数选取为array[high],那么必须先从低位low查找到大于基准的数,然后再从高位high寻找小于基准的数,交换;

        原因:

        当两侧查找相遇的时候,需要将基准数和相遇点元素的值交换以正确归位基准数;

        也就是若基准数=array[low]的这种情况,相遇点的元素值必须小于基准值,

         如果先从低位low查找大于基准的数,最终停止的元素大于基准值的话,就会导致归位失败。

5.代码:

int Partition(int array[], int low, int high){
    int base = array[low];
    while(low < high){
        while(low < high && array[high] >= base){
            high --;
        }
        swap(array,low,high);//array[low] = array[high];
        while(low < high && array[low] <= base){
            low ++;
        }
        swap(array,low,high);//array[high] = array[low];
    }
    array[low] = base;
    return low;
}
void QuickSort(int array[], int low, int high){
    if(low < high){
        int base = Partition(array,low,high);
        QuickSort(array,low,base - 1);
        QuickSort(array, base + 1, high);
    }
   
}

完整代码:

#include<stdio.h>
void Swap(int arr[], int low, int high)
{
    int temp;
    temp = arr[low];
    arr[low] = arr[high];
    arr[high] = temp;
}

int Partition(int arr[], int low, int high)
{
    int base = arr[low];
    while(low < high)
    {
        while(low < high && arr[high] >= base)
        {
            high --;
        }
        Swap(arr, low, high);
        while(low < high && arr[low] <= base)
        {
            low ++;
        }
        Swap(arr, low, high);
    }
    return low;
}

void QuickSort(int arr[], int low, int high)
{
    if(low < high)
    {
        int base = Partition(arr, low, high);
        QuickSort(arr, low, base - 1);
        QuickSort(arr, base + 1, high);
    }
}

int main()
{
    int n;
    scanf("%d\n",&n);
    int arr[n];
    int i , j;
    for(i = 0; i < n; i ++)
    {
        scanf("%d",&arr[i]);
    }
    printf("\n");
    QuickSort(arr, 0, n-1);
    for(j = 0; j < n; j ++)
    {
        printf("%4d",arr[j]);
    }
    return 0;
}

 

  • 40
    点赞
  • 166
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值