c语言实现快速排序

举报
仙士可 发表于 2023/06/21 16:43:31 2023/06/21
【摘要】 快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。#include <stdio.h>void swap(int *, int *);void quickSort(int[...

快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

#include <stdio.h>

void swap(int *, int *);

void quickSort(int[], int, int);

void printArrString(int[], int);

int main() {
    int arr[] = {55, 17, 9, 87, 12, 41, 23, 14, 20, 32, 85};
    quickSort(arr, 0, sizeof(arr) / sizeof(arr[0]) - 1);
    printArrString(arr, sizeof(arr) / sizeof(arr[0]));
    return 0;
}

void printArrString(int arr[], int length) {
    for (int i = 0; i < length; ++i) {
        if (i == 0) {
            printf("%d", arr[i]);
        } else {
            printf(",%d", arr[i]);
        }
    }
    printf("\n");
}

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

void quickSort(int arr[], int left, int right) {

    if (left >= right)/*如果左边索引大于或者等于右边的索引就代表已经整理完成一个组了*/
    {
        return;
    }

    int i = left;//当前最小范围
    int j = right;//当前最大范围
    int key = arr[left];//使用第一个值作为基准值
    for (; j > i; j--) {//从最后面开始往前查找
        if (arr[j] < key) {//如果有比基准值小的值
            swap(&arr[j], &arr[i]);//交换值
            //到这步的时候,可以100%确定比j大的值都小于基准值
            printf("b\n");
            printArrString(arr, right + 1);
            for (i++; i < j; i++) {//从最小范围后面开始查起
                if (arr[i] > key) {//如果大于基准值,
                    swap(&arr[i], &arr[j]);//则和j位置的数据交换
                    //到这步的时候,可以确定比j小的都小于基准值
                    printf("c\n");
                    printArrString(arr, right + 1);
                    break;
                }
            }
            //在这个时候,可能i和j并没有交叉(i和j中间还有没有查找完的值)
            //所以必须继续查询比基准值大/小的值,直到i==j,也就是i左边的值都比基准值大,右边的值都比基准值小
        }
    }
    //获得的左边的值,继续拆分,直到不能拆分(i>=j)
    quickSort(arr, left, i - 1);
    //获得的右边的值,继续拆分,直到不能拆分(i>=j)
    quickSort(arr, i + 1, right);
}
复制
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。