c语言快速排序算法总结(详解)

快速排序是一种分治算法,其基本原理如下:

  1. 选择一个基准元素(pivot),通常选择序列中的第一个元素。
  2. 将序列分为两部分,使得左边部分的元素都小于等于基准元素,右边部分的元素都大于基准元素。这个过程称为分区(partition)操作。
  3. 对左右两部分分别递归地应用快速排序算法。
  4. 当左右两部分都排序完毕后,整个序列就变得有序。

具体实现时,快速排序的分区操作可以采用多种方法,常见的是使用双指针或者挖坑填数的方式进行分区。在实际应用中,为了提高排序的稳定性,通常会对小规模子序列采用其他排序算法,例如插入排序。快速排序的时间复杂度通常为O(nlogn),在最坏情况下为O(n^2)。快速排序是一种不稳定的排序算法,因为在分区操作中可能会改变相同元素的相对顺序。快速排序在实际应用中广泛使用,因为它在平均情况下具有较好的性能,并且可以采用原地排序的方式,节省了额外的空间开销。
在这里插入图片描述递归结束的条件是I < J

快速排序代码截图

在这里插入图片描述快速排序代码实现

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string.h>
#include <time.h>
#include <sys/timeb.h>

#define MAX 10
using namespace std;

// 打印函数
void PrintArray(int arr[], int length) {
    for (int i = 0; i < length; i++) {
        cout << arr[i] << " ";

    }
    cout << endl;

}
// 快速排序的实现,从小到大
void QuickSort(int arr[],int start, int end) {
    // 
    int i = start;
    int j = end;
    // 基准数所有的数都和他进行比较
    int temp = arr[start];

    if (i < j) {
    
        while (i < j) {
            while (i < j && arr[j] >= temp) {
                //从右向左找符合条件的
                j--;
    
            }
            // 填充数据
            if (i < j) {
                arr[i] = arr[j];
                i++;
            }
            // 从左向右找比基准数更大的数
            while (i < j && arr[i] < temp) {
                i++;
            }
            // 填坑
            if (i < j) {
                arr[j] = arr[i];
                j--;
            }
        }
        // 把基准数放到i的位置或者是j的位置
        arr[i] = temp;
        // 对基准数的左半部分进行快速排序
        QuickSort(arr, start, i - 1);
        // 对基准数的右半部分进行快速排序
        QuickSort(arr, i + 1, end);
    }

}

int main(void)
{
    int myArr[] = { 4,2,8,0,5,7,1,3,9 };
    int len = sizeof(myArr) / sizeof(myArr[0]);
    PrintArray(myArr, len);
    QuickSort(myArr,0,len - 1);
    PrintArray(myArr, len);


    return 0;

}

快速排序运行结果展示

在这里插入图片描述

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值