效果演示:
原理分析(从小到大):
- 首先取出一个key,一般取第一个元素。
- 从后往前遍历,如果数组中的数据小于了key,那么就将从前往后未比较过的第一个位置即fisrt位置替换为该数据。
- 然后从前往后遍历,如果数组中的数据大于了key,那么就将从后往前的第一个比较过数据位置替换。
- 直到左右两边的位置重合,说明key就找到了正确的位置,每次循环就能找到一个数的正确位置。
- 然后将key左右两边的数据分为两组,递归调用自己。
源码①:
#include <iostream>
using namespace std;
#define N 10
// left与right初值为序列下标(例如 1 与 n)
void msort(int arr[], int low,int high){
int first=low;
int last=high;
int key=arr[first];
// 区间里面只有一个数或者没有数
if(low >= high){
return;
}
// 当前区间的长度超过1
while(first < last){
// 输入数据中有相同的数字时,会跑不出来...在while循环中,判断条件可以改成arr[last]>=key
while(first<last && arr[last]>=key){ // 反复左移
last--;
}
arr[first]=arr[last];
while(first<last && arr[first]<=key){ // 反复右移
first++;
}
arr[last]=arr[first];
}
arr[first]=key;
// 对左子区间递归进行快速排序
msort(arr,low,first-1);
// 对右子区间递归进行快速排序
msort(arr,first+1,high);
}
int main(){
int arr[N];
for(int i=0;i<N;i++){
cin >> arr[i];
}
msort(arr,0,N-1);
for(int i=0;i<N;i++){
cout << arr[i] << " ";
}
return 0;
}
/*
测试案例:
9 8 7 6 5 4 3 2 1 0
9 8 8 6 5 4 5 2 1 0
5 8 8 6 5 4 5 2 1 9
*/
参考:https://blog.csdn.net/weixin_43864567/article/details/113753440