快速排序算法分析

本文通过详细的代码解析和调用过程分析,介绍了快速排序的基本原理及其实现方式。通过对两种不同实现方式的对比,帮助读者理解快速排序的核心思想。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "stdafx.h"
void Qsort(int a[], int low, int high)
{
    if (low >= high)
    {
        printf_s("终止条件...\n");
        return;
    }
    printf_s("调用Qsort开始:\n");
    int first = low;
    int last = high;
    int key = a[first];/*用字表的第一个记录作为枢轴*/

    int m = 1;
    while (first < last)
    {
        while (first < last && a[last] >= key)
        {
            --last;
        }
        a[first] = a[last];/*将比第一个小的移到低端*/
        while (first < last && a[first] <= key)
        {
            ++first;
        }

        a[last] = a[first];
        /*将比第一个大的移到高端*/
        for (int i = 0; i < 9; i++)
        {
            printf_s("%d\t", a[i]);
            //cout << a[i] << "";
        }

        printf_s("first:%d\t,last:%d\t", first, last);
        printf_s("-----第%d次\n",m++);
    }
    a[first] = key;/*枢轴记录到位*/

    printf_s("本次调用Qsort结果\n:");
    for (int i = 0; i < 9; i++)
    {
        printf_s("%d\t", a[i]);
    }

    printf_s("\n调用Qsort结束。\n\n");
    Qsort(a, low, first - 1);
    Qsort(a, first + 1, high);
}
int main()
{
    int a[] = { 57, 68, 59, 52, 72, 28, 96, 33, 24 };

    Qsort(a, 0, sizeof(a)/sizeof(a[0]) - 1);/*这里原文第三个参数要减1否则内存越界*/

    printf_s("排序结果:\n");
    for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
    {
        printf_s("%d\t",a[i]);
        //cout << a[i] << "";
    }
    printf_s("\n");
    return 0;
}

这里写图片描述
上面这段代码摘自百度百科-快速排序。
初始值:
57 68 59 52 72 28 96 33 24
调用结果分析:
Key = 57
24 68 59 52 72 28 96 33 68 first,last(1,8) —1

24 33 59 52 72 28 96 59 68 first,last(2,7) —2

24 33 28 52 72 72 96 59 68 first,last(4,5) —3

24 33 28 52 72 72 96 59 68 first,last(4,4) —3
枢轴记录到位后,本次调用Qsort结果:
:24 33 28 52 57 72 96 59 68

经过本次循环,Key左边的值都小于Key,Key右边的值都大于Key
下面分别再对57左右两边的数据调用QSort,递归;

上面的QSort是最终while (first < last)一次循环结束后才对最后这个a[first]赋值为key
:a[first] = key;/枢轴记录到位/ //这句是把最终first所指的72换成初始时给的key值:57。

试着写了下快速排序,如下,与上面的区别主要在:一次QSort调用中每次进行交换操作时,交换操作是否交换的彻底。
写成下面这样,每次交换操作时,都彻底交换值:

void Qsort(int a[], int low, int high)
{
    if (low >= high)
    {
        return;
    }
    int first = low;
    int last = high;
    int numKey = first;
    int key = a[numKey];
    while(first < last)
    {
        while (a[last] >= key&&first < last)// 从后往前遍历,找到一个小于key的
        {
            last--;
        }
        a[numKey] = a[last]; 
        a[last] = key;
        numKey = last; //last与numKey所指的值交换后,numKey换成指last值。
        while (a[first] <= key&&first < last) //从前往后找,找一个大于key的
        {
            first++;
        }
        a[numKey] = a[first];
        a[first] = key;
        numKey = first; //first与numKey所指的值交换后,              numKey换成指first值。
    }
    Qsort(a,low,numKey-1);
    Qsort(a,numKey+1,high);
}

numKey用来记录当前key所在的位置。

–欢迎指正和补充!–

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值