C++递归实现快速排序

一.快速排序的递归代码思路

1.关于递归和回溯(因为递归调用牵扯到了所以就稍微展开讲一下)

  • 下面是快排应用最好的情况下的分析图
  • 这就是最好的情况下,递归调用的图
  • 这里牵扯到了栈帧的开辟与回退和算法复杂度的问题,大家可以去看其他人的博客。这里就不再赘述

2.代码的实现,为何去定义一些变量以及函数的设计

//
// Created by 18751 on 2023/5/13.
//
#include<iostream>
using namespace std;
int partition(int*, int, int);//这个函数是划分快速排序的位置,返回值设计成int是为了返回left所在的位置
void quickSort(int*,int,int);//这个是对于是否可以继续递归的一个条件,会调用parttion函数
void show(int*,int);//这个是对排列好的数组的展示
int main(){//主函数,不过多赘述
    int arr[] = {9,8,7,6,5,4,3,2,1};//定义需要处理的数组
    int size = sizeof(arr)/sizeof(arr[0]);//数组的规模篇
    quickSort(arr, 0, size - 1);//函数的调用
    show(arr,size);
}
int partition(int* arr, int left, int right){//参数设计成三个,是因为要体现出规模的话。必须实在一个区间里面,
//传参需要传需要处理的数据,和需要处理的区域
    int temp;//会用来记录每次left所在下标的数组值
    while(left<right){//循环推出条件,左指针不能再右指针右边
        temp=arr[left];
        while(left<right&&arr[right]>temp){//从右向左找到第一个小于left下标的数
            right--;
        }
        arr[left]=arr[right];
        while(left<right&&arr[left]<=temp){//从左至右找第一个大于left下标的数
            left++;
        }
        arr[right]=arr[left];
    }
    arr[left]=temp;
    return left;
}
void quickSort(int* arr,int left,int right){
    int index = partition(arr,left,right);
    if(index-left>=2){//只有当规模是两个或以上才可能是无序的,下同
        quickSort(arr,left,index-1);
    }
    if(right-index>=2){
        quickSort(arr,index+1,right);
    }
}
void show(int* arr,int size){
    for (int i = 0; i < size; ++i) {
        cout<<arr[i]<<" ";
    }
    cout<<endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个非递归实现快速排序的C代码示例: ```c #include <stdio.h> // 用于交换数组中两个元素的值 void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } // 划分函数,将数组划分为两部分,并返回划分点的下标 int partition(int arr[], int low, int high) { int pivot = arr[high]; // 选取最后一个元素作为基准 int i = (low - 1); // i为小于等于基准的元素的最右位置 for (int j = low; j <= high - 1; j++) { // 如果当前元素小于等于基准,则将其放到左侧 if (arr[j] <= pivot) { i++; swap(&arr[i], &arr[j]); } } swap(&arr[i + 1], &arr[high]); // 将基准放到正确的位置 return (i + 1); // 返回基准的位置 } // 快速排序函数 void quickSort(int arr[], int low, int high) { // 创建一个栈用于存储需要排序的子数组的起始和结束位置 int stack[high - low + 1]; int top = -1; // 初始化栈 stack[++top] = low; stack[++top] = high; // 循环直到栈为空 while (top >= 0) { // 从栈中取出需要排序的子数组的起始和结束位置 high = stack[top--]; low = stack[top--]; // 将数组划分为两部分,并获取基准的位置 int pivot = partition(arr, low, high); // 如果基准左侧有更多元素,则将左侧的子数组入栈 if (pivot - 1 > low) { stack[++top] = low; stack[++top] = pivot - 1; } // 如果基准右侧有更多元素,则将右侧的子数组入栈 if (pivot + 1 < high) { stack[++top] = pivot + 1; stack[++top] = high; } } } // 测试快速排序 int main() { int arr[] = {9, -2, 5, 3, 10, 0}; int n = sizeof(arr) / sizeof(arr[0]); printf("原始数组: "); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } quickSort(arr, 0, n - 1); printf("\n排序后的数组: "); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0; } ``` 这段代码使用了一个栈来模拟递归调用的过程,通过不断将需要排序的子数组的起始和结束位置入栈,并在循环中出栈并划分数组,直到栈为空,完成排序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值