排序前将s[i]做为标杆,不挖坑,比较后直接交换。
先从最右边比较,然后左边,
将比标杆小的数全部放到左边
void quick_sort(int s[], int l, int r) { //l,r为最左和最右下标
if (l < r) { //判断条件防止递归错误
int i = l, j = r;
while (i < j) {
while (i < j) {
if (s[i] > s[j]) { //条件成立直接交换
std::swap(s[i], s[j]);
i++; //交换完成,将下标加1,为下一次比较做准备.(也可省略)
break;
}
j--;
}
while (i < j) {
if (s[j] < s[i]) {
std::swap(s[i], s[j]);
j--; //可省略,影响效率,不影响结果
break;
}
i++;
}
}
quick_sort(s, l, i - 1); //右半递归
quick_sort(s, i + 1, r); //左半递归
}
}
第二种解法,
每次比较前,先比较标杆下一位是否比标杆小,如果小,交换
然后再从最右边开始比较,如果找到目标,将目标移到标杆位,
将标杆下移一位,标杆的下一位放到目标位。
void quick_sort(int s[], int l, int r) { //l,r为最左和最右下标
if (l < r) { //判断条件防止递归错误
int i = l, j = r;
while (i < j) {
while((s[i]>s[i+1])&&(i<j)){
std::swap(s[i],s[i+1]);
i++;
}
if (s[i] > s[j]) {
int temp = s[i+1];
s[i+1]=s[i];
s[i]=s[j];
s[j]=temp;
i++;
}
j--;
}
quick_sort(s, l, i - 1); //右半递归
quick_sort(s, i + 1, r); //左半递归
}
}
网上也有很多其他方法,可以多看看,找一种自己能理解的,效率高的熟悉算法。