快速排序优化
普通快速排序
常规的快速排序是采用两个哨兵i,j来分别从左右找到的更换值,一直找到i,j两个哨兵相遇(i=j)
在一个while循环中用两个while分别来找更换值
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
int a[101];
void quicksort(int l, int r) {
if (l > r) return;
int i = l;
int j = r;
int temp = a[l];
//这个while()循环会一直快排到i=j(标志左边的数都比标志小,右边的数都比标志大)
while (i != j) {
while (a[j] >= temp && i < j) j--; //从后往前找第一个比temp标志位小的数
while (a[i] <= temp && i < j) i++; //从前往后找第一个比temp标志位大的数
if (i < j) { //当i,j没有相遇时,交换两个数
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
//最终i=j时,将作为基准数的a[left]即temp数与重复位置a[i]的数交换
a[l] = a[i]; //a[]l的值等于a[i](i,j相等的位置)
a[i] = temp; //i,j相等的位置等于标志位
//递归处理得到的两个子序列
quicksort(l, i - 1);
quicksort(i + 1, r);
return;
}
int main() {
int n = 10;
cout << "排序前:" << endl;
for (int i = 1; i <= n; i++)
cin >> a[i];
quicksort(1, n);
cout << "排序后:" << endl;
for (int i = 1; i <= n; i++) {
cout << a[i] << " ";
}
cout << endl;
system("pause");
return 0;
}
从小到大排序:
快速排序优化
优化过后只需要遍历一遍就可以完成标志位对整个序列的一次分割
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
int a[101];
void quicksort(int l, int r) {
if (l > r) return;//递归结束条件
int pvoit = a[r];//将最右侧的值设定为标志位,并用pvoit保存
int i = l;//将i指向第一个元素位置
//从开头遍历到结尾来找比标志位值小的位置的数
for (int j = l; j < r; j++) {
if (a[j] < pvoit) {
swap(a[i++], a[j]);//每找到一个比标志值小的,就将它移到前面(有桶排序的意思)
//i++; //移动后将i向前移一个(有桶排序的意思)这个操作可以移到上一步中
}
}
swap(a[i], a[r]);//换结束后将标志位放到i位置
//注意是放到i位置(因为是从0开始计数,如果从1开始计数就是i+1)
quicksort(l, i-1);
quicksort(i+1, r);
return;
}
int main() {
int n = 10;
cout << "排序前:" << endl;
for (int i = 0; i < n; i++)
cin >> a[i];
quicksort(0, n-1);
cout << "排序后:" << endl;
for (int i = 0; i < n; i++) {
cout << a[i] << " ";
}
cout << endl;
system("pause");
return 0;
}
从小到大排序: