C语言:快速排序

排序思想

1.快排是对冒泡排序的一种改进,在快速排序中,元素的比较和移动是从两端向中间进行的,关键码较大的元素一次就能从前面移动到后面,关键码较小的元素一次就能从后面移动到前面,元素移动距离的较远,从而减少了总的比较次数和移动次数

2.快速排序是基于分治法设计的,其分治策略是:
①、划分:选定一个元素作为轴值,以轴值为基准将整个序列划分为两个子序列。轴值的位置在划分的过程中确定,并且前一个子序列的元素均小于或者等于轴值,后一个子序列的元素大于或者等于轴值

②、求解子问题:分别对划分后的每一个子序列递归处理
③、合并:由于对子序列的排序是就地进行的,所以合并并不需要执行任何操作

排序方法

1.选择轴值,一般是选取第一个元素的关键码。有一个快排的最坏情况就是如果待排序元素是正序或者逆序,就会将除轴值以外的元素分到轴值的一边。
2.划分
①、设置划分区间:i=first,j=end
②、执行右侧扫描,直到r[j]小于轴值,将r[j]与r[i]交换,i++
③、执行左侧扫描,直到r[i]大于轴值,将r[i]与r[j]交换,j–
④、重复二到三直到i=j,确定看轴值的所在位置,返回该位置

初始键值序列      23  12  35  6  19  50  28
一次划分后       [19  13  6] 23 [35 50 28]
分别进行快速排序  [6  13] 19
                 6  [13]
                    13
                               [28] 35 [50]
                                28  35
                                        50
最终结果           6  13  19  23  28  35  50                                        

3.对待排序序列进行了一次划分后,在分别对左右两个子序列进行快速排序,以此类推。

算法实现

#include<stdio.h>
#include<stdlib.h>

/*
快速排序
*/


//打印的数组
void Print(int args[], int end){
    int i;

    for (i = 0; i <= end; i++){
        printf("%d,", args[i]);
    }
    printf("\n");
}

//快速排序一次划分算法
int Partition(int args[], int first, int end){

    int i,j;
    int temp;
    i = first;
    j = end;

    while (i < j){
        //进行右侧扫描
        while (i < j&&args[i] < args[j])j--;
        if (i < j){
            temp = args[i];
            args[i] = args[j];
            args[j] = temp;
            i++;
        }
        //进行左侧扫描
        while (i < j&&args[i] <= args[j]) i++;
        if (i < j){
            temp = args[i];
            args[i] = args[j];
            args[j] = temp;
            j--;
        }
    }

    return i;
}

//快速排序算法,递归调用
void QuickSort(int args[], int first, int end){
    int pivot;
    if (first < end){
        pivot = Partition(args, first, end);
        printf("排序中:");
        Print(args, end);

        QuickSort(args, first, pivot - 1);
        QuickSort(args, pivot + 1, end);
    }
}


int main(void){
    int args[] = { 23, 13, 35, 6, 19, 50, 28 };
    int first = 0;
    int end = 6;
    //打印排序前的数组
    printf("原始数组:");
    Print(args, end);
    QuickSort(args, first, end);
    printf("排序完成后的数组:");
    Print(args, end);
    system("pause");
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值