初始算法----快速排序

目录

一. 快排介绍

二. 快排实现 

2.1.1 单趟动画排序

​编辑

2.1.2 单趟排序

2.2 多趟排序

 三. 整体代码


一. 快排介绍

        快速排序(Quick Sort)是一种常用的排序算法,效率较高。它的基本思想是选择一个基准元素,将待排序序列分成两个子序列,其中一个子序列的所有元素都比基准元素小,另一个子序列的所有元素都比基准元素大,然后对这两个子序列分别进行递归调用快速排序。快速排序的时间复杂度为O(nlogn),是一种效率较高的排序算法。

二. 快排实现 

2.1.1 单趟动画排序

2.1.2 单趟排序

默认基准元素定为最左边元素 i和j分别从两端开始向中间移动 当i停在比基准元素小的元素和j停在比基准元素大的元素时 交换两端的值 最后再将新的基准值返回 这一趟便完成了

int partition(int nums[], int left, int right) {
    // 以 nums[left] 为基准数
    int i = left, j = right;
    while (i < j) {
        while (i < j && nums[j] >= nums[left]) {
            // 从右向左找首个小于基准数的元素
            j--;
        }
        while (i < j && nums[i] <= nums[left]) {
            // 从左向右找首个大于基准数的元素
            i++;
        }
        // 交换这两个元素
        swap(nums, i, j);
    }
    // 将基准数交换至两子数组的分界线
    swap(nums, i, left);
    // 返回基准数的索引
    return i;
}

2.2 多趟排序

 总的就是在单趟排序的基础上 将基准值左右两边的 数组再次进行相同的单趟排序排序

void qsort(int nums[], int left, int right) {
    // 子数组长度为 1 时终止递归
    if (left < right) {
    // 哨兵划分
    int pivot = partition(nums, left, right);
    // 递归左子数组、右子数组
    qsort(nums, left, pivot - 1);//根据基准换分的左右数组进行递归来排序
    qsort(nums, pivot + 1, right);
    }
}

 三. 整体代码

#include<stdio.h>

void swap(int nums[], int i, int j) {
    int tmp = nums[i];
    nums[i] = nums[j];
    nums[j] = tmp;
}
/* 快速排序类 */
// 快速排序类-哨兵划分
int partition(int nums[], int left, int right) {
    // 以 nums[left] 为基准数
    int i = left, j = right;
    while (i < j) {
        while (i < j && nums[j] >= nums[left]) {
            // 从右向左找首个小于基准数的元素
            j--;
        }
        while (i < j && nums[i] <= nums[left]) {
            // 从左向右找首个大于基准数的元素
            i++;
        }
        // 交换这两个元素
        swap(nums, i, j);
    }
    // 将基准数交换至两子数组的分界线
    swap(nums, i, left);
    // 返回基准数的索引
    return i;
}

// 快速排序类-快速排序
void qsort(int nums[], int left, int right) {
    // 子数组长度为 1 时终止递归
    if (left < right) {
    // 哨兵划分
    int pivot = partition(nums, left, right);
    // 递归左子数组、右子数组
    qsort(nums, left, pivot - 1);
    qsort(nums, pivot + 1, right);
    }
}

int main(){
    int a[]={6,2,4,3,3,1},n=6;
    int z=0,y=5;
    qsort(a,z,y);
    for(int i=0;i<n;i++)
        printf("%d",a[i]);
}




 运行后

| |

\/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值