#感受
关于算法设计与分析课程中的利用递归和分治思想进行快速排序,看了几篇博客和视频后,仍是有些模糊,一些视频也只是动态的演示了思想,而博客只在文字层面描述思想,代码中不断的递归也让人难以进行追随代码进行思考;
我这边发现了一个视频,对着代码一步一步地编译,看得到每一步都发生了什么,虽然有些嘴瓢瑕疵,但是还是容易跟随的,很推荐去看,长度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]);
}
}