下面就快速排序的相关知识进行了总结
快速排序算法基本步骤
1.确定一个基准值(以最右边元素为基准值)
下图中蓝色部分表示选取的基准值
2.通过某种方式,遍历整个区间,每个元素和基准值进行比较,最终使基准值的左边全部是小于等于基准值的元素,基准值的右边为大于基准值的元素。
3.对左右两个小区间重复上述步骤。
1.基准值的选取方法:
(1)随机法
(2)取最左边或最右边元素
(3)三数取中法: 三数指:区间最左边的元素,区间最右边元素,区间中间元素。从这三个数据元素中选取值为中间大小的数据元素
2.将区间按照基准值划分为左右区间的三种方法
(1)Hover法
int Partition(int array[], int left, int right) {
int begin = left;
int end = right;
int pivot = array[right]; // 基准值
while (begin < end) {
while (begin < end && array[begin] <= pivot) {
begin++;
}
// 跳出循环时,一定是array[begin] > pivot
while (begin < end && array[end] >= pivot) {
end--;
}
//跳出循环时,一定是 array[end] < pivot
//交换array[begin]和array[end]的值
Swap(array, begin, end);
}
// 把 基准值 和 begin 所在的下标交换,和第一个比 pivot 大的数交换
Swap(array, begin, right);
return begin;
}
(2)挖坑法
int Partition(int array[], int left, int right) {
int begin = left;
int end = right;
int pivot = array[right]; // 基准值
while (begin < end) {
while (begin < end && array[begin] <= pivot) {
begin++;
}
array[end] = array[begin];
while (begin < end && array[end] >= pivot) {
end--;
}
array[begin] = array[end];
}
array[begin] = pivot;
return begin;
}
(3)前后指针法
int Partition(int array[], int left, int right) {
int d = left;
for (int i = left; i < right; i++) {
if (array[i] < array[right]) {
Swap(array, i, d);
d++;
}
}
Swap(array, d, right);
return d;
}
完整代码
void Swap(int arr[], int i, int j){
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
int Partition(int array[], int left, int right) {
int begin = left;
int end = right;
int pivot = array[right]; // 基准值
while (begin < end) {
while (begin < end && array[begin] <= pivot) {
begin++;
}
array[end] = array[begin];
while (begin < end && array[end] >= pivot) {
end--;
}
array[begin] = array[end];
}
array[begin] = pivot;
return begin;
}
void QuickSortInner(int array[], int left, int right) {
if (left == right) {
return;
}
if (left > right) {
return;
}
int d = Partition(array, left, right);
QuickSortInner(array, left, d - 1);
QuickSortInner(array, d + 1, right);
}
void QuickSort(int array[], int size) {
QuickSortInner(array, 0, size - 1);
}