一般我们在对数据进行排序时都采用冒泡排序法,然而冒泡排序算法中在对数据进行遍历一遍时,只能排序一个数据到正确的位置上去,其算法的时间复杂度为o(n^2),该算法的效率比较低,而快速排序算法是在冒泡排序的基础上提出的快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:
1、在一组比较的数据中取一个数为基准数。
2、通过对基准数与其它数据比较,将大于基准数的数据放到基准数的右边,反之小于基准数的数据放到左边。
3、然后在以基准数为界限的两部分数据进行递归,依次使整个数据变成有序序列。
其中这种快速排序的思想可以看成:挖坑填数+分治法。
挖坑填数法如图所示:
首先选定数组第一个数据作为基准值。将其保存在temp变量中,在此处挖坑等待小于基准值的数据填入,然后开始第一步重右向左比较哪个数据小于基准值,则将该数填入到该坑出,第二步因为第一次重右找到小于基准值使数据43,且上次又在该处挖坑,因此接下来应该重左向右找大于该基准值的数,放入到该坑处,如下图所示。
当所有数据比较完后,则数据会排序成以基准值为中心,左边都是小于基准值的数据,右边都是大于基准值的数据。如下图所示
2、分治法:就是在将原数组的长度以基准值为界限划分为2个无序数组,在对这两个数组重新排序重复以上过程,最后都使整个数组都变成有序排列。
void quick_sort(int* arr,int begin,int end)
{
int i = begin;
int j = end;
int temp = arr[begin];
if (begin < end)
{
while (i < j)
{
while (i<j&&arr[j]>temp)
{
j--;
}
if (i < j)
{
arr[i] = arr[j];
}
while (i < j&&arr[i] < temp)
{
i++;
}
if (i < j)
{
arr[j] = arr[i];
}
}
arr[i] = temp;
quick_sort(arr, begin, i - 1);
quick_sort(arr, i + 1, end);
}
else
return;
}
int main()
{
int arr[10] = { 72,6,57,88,60,42,83,73,43,85 };
int i = 0;
int len = sizeof(arr) / sizeof(arr[0]) - 1;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
quick_sort(arr,0,len);
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}