递归和分治 快速排序

#感受
关于算法设计与分析课程中的利用递归和分治思想进行快速排序,看了几篇博客和视频后,仍是有些模糊,一些视频也只是动态的演示了思想,而博客只在文字层面描述思想,代码中不断的递归也让人难以进行追随代码进行思考;
我这边发现了一个视频,对着代码一步一步地编译,看得到每一步都发生了什么,虽然有些嘴瓢瑕疵,但是还是容易跟随的,很推荐去看,长度17分钟添加链接描述
理解算法后,重新写了一遍代码,并写了一些注释帮助理解,下面是代码:

#include <iostream>
#include <stdio.h>

using namespace std;
void quickSort(int nums[],int low,int high){
    if(low>=high)
        return;
    int l = low;
    int r = high;
    int temp = nums[l];
    while(l<r){//循环结束时,nums[low]到nums[r](nums[l])是小值,nums[r+1]到nums[high]是大值
        while(nums[r]>temp && l<r){//跳出循环时,nusm[r]需要交换
            r--;
        }
        while(nums[l]<=temp && l<r){//跳出循环时,nusm[l]需要交换
            l++;
        }
        if(l<r){
            swap(nums[l],nums[r]);//交换nums[l]和nums[r]
        }
    }
    swap(nums[low],nums[r]);//循环结束后,需要最靠右的小值(nums[l]或nums[r])与中间值
                            //(每一层的中间值都取的是low=上一层的最左值,同时也是本层的小值中的一个,所以交换后不改变小-大的结构)
    quickSort(nums,low,l-1);//nums[l]为上一层的中间值,无需再次参与排序,所以选择nums[low](小的最左值)到nums[l-1](小的最右值)进行排序
    quickSort(nums,l+1,high);//nums[l]为上一层的中间值,无需再次参与排序,所以选择nums[l+1](大的最左值)到nums[high](大的最右值)进行排序

}

int main() {

    int a[100];
    int n;
    scanf("%d",&n);
    for(int i=0; i<n; i++) {
        scanf("%d",&a[i]);
    }
    quickSort(a,0,n-1);
    for(int i=0; i<n; i++) {
        printf("%d ",a[i]);
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值