快排
一.确定基准值有3种
- 选最左或者最右的那个数作为基准值
- 三数取中法(就是取left,mid和right三个数中中间的那个数作为基准值)
- 取随机值作为基基准值
二.将数组分为两部分比基准值小的放在左边,比基准值大的放在右边
1.Hover法:b就是下面代码的begin e是end
2.挖坑法:用圆圈圈的为坑
3.前后下表法:c就是代码里面的i
三.分治算法(将一个大问题转化为两个小问题)
将[ left , right ]区间分为[ left ,div-1 ]和[ div+1 , right]
四.终止条件
1.left == right 数组里面只剩下一个数了为有序的
2.left < right 数组里没有数了
#include<stdio.h>
#include<stdlib.h>
void Swap(int *a, int *b){
int tmp = *a;
*a = *b;
*b = tmp;
}
//前后坐标
int Parition_3(int arr[], int left, int right){
int d = left;
for (int i = left; i < right; i++){
if (arr[i] < arr[right]){
Swap(arr + d, arr + i);
d++;
}
}
Swap(arr + d, arr + right);
return d;
}
//挖坑法
int Parition_2(int arr[], int left, int right){
int pivot = arr[right];
int begin = left;
int end = right;
while (begin < end){
while (begin<end&&arr[begin] <= arr[right]){
begin++;
}
arr[end] = arr[begin];
while (begin<end&&arr[end] >= arr[right]){
end--;
}
arr[begin] = arr[end];
}
arr[begin] = pivot;
return begin;
}
//Hover法
int Parition_1(int arr[], int left, int right){
int begin = left;
int end = right;
while (begin < end){
while (begin<end&&arr[begin] <= arr[right]){
begin++;
}
while (begin<end&&arr[end] >= arr[right]){
end--;
}
Swap(arr + begin, arr + end);
}
Swap(arr + begin, arr + right);
return begin;
}
void QuickSort(int arr[], int left,int right){
if (left >= right){
return;
}
int div = Parition_3(arr, left, right);
QuickSort(arr, left, div - 1);
QuickSort(arr, div+1, right);
}
int main(){
int arr[] = { 9,4,3,8,5,7 };
int size = sizeof(arr) / sizeof(int);
int left = 0;
int right = size - 1;
QuickSort(arr, left,right);
for (int i = 0; i < size; i++){
printf("%d ", arr[i]);
}
printf("\n");
system("pause");
return 0;
}