一、快速排序算法
快速排序采用的是分治思想,即在一个无序的序列中选取一个任意的基准元素pivot,利用pivot将待排序的序列分成两部分,前面部分元素均小于或等于基准元素,后面部分均大于或等于基准元素,然后采用递归的方法分别对前后两部分重复上述操作,直到将无序序列排列成有序序列。
二、挖坑法
挖坑法:
第一步,先把数组中的第一个数拿出来,当作一个key,把拿出数的位置看作一个坑pivot。
第二步,坑pivot在第一个位置,先从最右边开始找小于key的数,并将其放值在坑的位置,这个数放到先前的坑后,将成为新的坑位。
第三步,从左边开始找大于key的数,并将其放值在当前坑的位置,这个数放到坑后,将成为新的坑位。
第四步,将key赋值给最后一个坑pivot,这时就排好一个数的位置了。
第五步,递归循环往复。
三、代码
#include<stdio.h>
//打印
void PrintArray(int* a, int n)
{
for (int i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
printf("\n");
}
void QuickSort(int* a, int left, int right)
{
if (left >= right)
return;
int begin = left, end = right;
int pivot = begin; //初始坑位在第一个位置
int key = a[begin];
while (begin < end)
{
//右边开始找小,放到左边
while (begin < end && a[end] >= key)
{
--end;
}
//把小的数放到坑位里,自己成为新的坑位
a[pivot] = a[end];
pivot = end;
//左边找大,放到右边
while (begin < end && a[begin] <= key)
{
++begin;
}
//把大的数放到坑位里,自己成为新的坑位
a[pivot] = a[begin];
pivot = begin;
}
pivot = begin;
a[pivot] = key;
//分为 左区间,右区间 递归,当左右区间都有序了,整体就有序了
QuickSort(a, left, pivot - 1);
QuickSort(a, pivot + 1, right);
}
void TestQuickSort()
{
int a[] = { 49,38,65,97,76,13,27,49 };
QuickSort(a, 0, sizeof(a) / sizeof(int) - 1);
PrintArray(a, sizeof(a) / sizeof(int));
}
int main()
{
TestQuickSort();
return 0;
}