快速排序的大致步骤是:
1.确定基准值(把区间的最右侧作为基准值)
2.遍历整个区间,使比基准值小的数在基准值左边,比基准值大的在基准值右边
3.分治算法依次解决左右两个小的无序区间
4.直到小区间size= =0小区间没有数,size==1小区间只有一个数,有序
要排序的区间使array[left,right]
void QuickSort(int array[],int left,int right)
size==0
if(left>right){
return;
}
size= =1
if(left==right){
return;
}
确定基准值array[right],
Partition(array,left,right)遍历整个区间
基准值的最终下标为 d
d=Partition(array,left,right);
左侧小区间为 array[left,d-1)
右侧小区间为array[d+1,right)
分治算法解决两个小区间
QuickSort(int array,left,d-1);
QuickSort(int array,d+1,right);
Partition(array,left,right);
遍历区间把小的放基准值左边,大的放在基准值右边有三种方法:
1.hover 法
int Parition_1(int array[], int left, int right) {
int begin = left;
int end = right;
// 基准值是 array[right]
while (begin < end) {
// 优先走左边
while (begin < end && array[begin] <= array[right]) {
begin++;
}
// 一定是左边卡住了
// 再走右边
while (begin < end && array[end] >= array[right]) {
end--;
}
// 一定是右边也卡住了
Swap(array + begin, array + end);
}
// 区间被分成 小,大,基准
Swap(array + begin, array + right);
// 返回当前基准值所在位置
return begin;
}里插入代码片
int Parition_1(int array[], int left, int right) {
int begin = left;
int end = right;
// 基准值是 array[right]
while (begin < end) {
// 优先走左边
while (begin < end && array[begin] <= array[right]) {
begin++;
}
// 一定是左边卡住了
// 再走右边
while (begin < end && array[end] >= array[right]) {
end--;
}
// 一定是右边也卡住了
Swap(array + begin, array + end);
}
// 区间被分成 小,大,基准
Swap(array + begin, array + right);
// 返回当前基准值所在位置
return begin;
}
2.挖坑法
int Parition_2(int array[], int left, int right){
int pivot = array[right]; //基准值
int begin = left;
int end = left;
while (begin<end){
//走begin向右走
while (array[left] <= pivot&&begin < end){
begin++;
}
//当arrayy[left]大与基准值的时候跳出循环在左侧挖坑将array[left]填入右侧的坑中
array[end] = array[begin];
//走end向左走
while (array[end] >= pivot&&begin < end){
end--;
}
array[begin] = array[end];
}
array[begin] = pivot;
return begin;
}
3.上下标法
int Parition_3(int array[], int left, int right){
int d = left;
for (int i=left; i < left; i++){
if (array[i] < array[right]){
Swap(array + d, array + i);
d++;
}
}
Swap(array + d, array + right);
return array[d];
}