1、快速排序算法
快速排序(Quick Sort)的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。
基本实现思路:快速排序算法每一趟排序都需要一个基准数,一般以待排序的序列最左边的第一个数值为基准数,然后设置两个哨兵在待排序的序列的两端,左哨兵往右寻找比基准数大的数值,右哨兵往左寻找比基准数小的数值,各找到一个后就交换,一直到左哨兵和右哨兵为止,左哨兵和右哨兵相遇的位置就基准数该在的位置,交换基准数和左哨兵,然后递归排序基准数左半部分的序列,递归排序基准数右半部分的序列。
/*快速排序递归算法*/
void Quick_Sort(int *arr, int left,int right)
{
if (left >= right) return; /*左与右相遇,说明已经排序完成,返回*/
int pivot = partition(arr, left, right); /*排序后,得到枢轴的位置*/
Quick_Sort(arr, left, pivot-1); /*以枢轴划分,递归排序左半部分*/
Quick_Sort(arr, pivot+1, right); /*以枢轴划分,递归排序右半部分*/
}
/*一趟排序后,返回枢轴的位置*/
int partition(int *arr, int left,int right)
{ /*一般以序列最左边的第一个数为基准数*/
int pivot = left; /*枢轴记录基准数的位置*/
while (left < right) /*直到左、右哨兵相遇,完成排序*/
{
/*右哨兵先左移,直到找到小于基准数的,或遇到左哨兵时停下*/
while (left < right && arr[right] >= arr[pivot])
right--;
/*然后左哨兵右移,直到找到大于基准数的,或遇到右哨兵时停下*/
while (left < right && arr[left] <= arr[pivot])
left++;
/*此时右哨兵指向小于基准数的,左哨兵指向大于基准数的,交换它们*/
swap_arr(arr,