快速排序
思路:
1.确定一个基准值,
2.比基准值小的放左边,比基准值大的放右边
3.按照分治思想,将基准值左边的如同上面的方法,确定基准值,然后比较,直到两个相邻基准值中的数等于1或没有,将右边也同样处理。
partion:
1、Hover法:将最右边的数定位基准值,第一个数为begin,最后一个数为end,begin开始向右移,end向左移,begin遇到小于等于基准值的向右移,大于基准值停下;
end遇到大于等于基准值的向左移,遇到小于基准值的停下,交换begin和end 的值
直到begin和end 之间的之为0,及比较了所有数与基准值的大小,保证比基准值大的在右边比基准值小的在左边。最后把基准值移到begin或end 处;
2、挖坑法:
将最右边一个定位基准值,然后保存起来,将最后一直值想象为一个坑,开始记为begin,最右边记为end,begin向右走,遇到比基准值大的,将begin的值赋给最后一个值,那么begin此时为坑,end 向左走,遇到小于基准值的,将end值给坑,那么begin就接着走,直到begin和end 中的数为0;最后将基准值begin位或end赋值给begin位或end。
3、前后下标法:
在div前面的比基准值小,在div到i之间的比基准值大。
#include<stdio.h>
#include<stdlib.h>
void swap(int* a, int* b) {
int t = *a;
*a = *b;
*b = t;
}
void print(int* a, int size) {
for (int i = 0; i < size; i++) {
printf("%d ", a[i]);
}
printf("\n");
}
---------------------------------------------------------------
1、Hover法:
int partion1(int* a, int left, int right) {
int begin = left;
int end = right;
int pivot = a[right];
while (begin < end) {
while (begin < end && a[begin] <= pivot) {
begin++;
}
while (begin < end && a[end] >= pivot) {
end--;
}
swap(a + begin, a + end);
}
swap(a + end, a + right);//交换基准值
return begin;
}
-------------------------------------------------------
2、挖坑法:
int partion2(int* a, int left, int right)
{
int begin = left;
int end = right;
int provte = a[right];
while (begin < end) {
while (begin < end && a[begin] <= provte) {
begin++;
}
a[end] = a[begin];
while (begin < end && a[end] >= provte) {
end--;
}
a[begin] = a[end];
}
a[begin] = provte;
return begin;
}
---------------------------------------------------------
3、前后下标法:
int partion3(int* a, int left, int right)
{
int div = left;
int i = left;
for (; i < right; i++)
{
if (a[i] < a[right]) {
swap(a + i, a + div);
div++;
}
}
swap(a + div, a + right);//交换基准值
return div;
}
--------------------------------------------------
void quicksort(int* a, int left, int right) {
if (left >= right) {
return;
}
int c = partion1(a, left, right);
quicksort(a, left, c - 1);
quicksort(a, c + 1, right);
}
void QuickSort(int* a, int size) {
quicksort(a, 0, size - 1);
}
int main() {
int a[] = { 3,8,4,5,7,9,6 };
int size = sizeof(a) / sizeof(int);
QuickSort(a, size);
print(a, size);
return 0;
}