快速排序算法(Quick Sort)
快速排序算法是在起泡排序的基础上进行改进的一种算法,其实现的基本思想是:通过一次排序将整个无序表分成相互独立的两部分,其中一部分中的数据都比另一部分中包含的数据的值小,然后继续沿用此方法分别对两部分进行同样的操作,直到每一个小部分不可再分,所得到的整个序列就成为了有序序列。
C语言中自带函数库中就有快速排序——qsort函数 ,包含在 <stdlib.h> 头文件中。
下面用C语言实现一下快速排序。
int _quick_sort1(int* arr, int left, int right) //子函数2
{
int pivot = arr[left]; // 以子表的起点作为标杆
while(left < right) // 当左右指针相遇时,循环结束
{
while(left < right && arr[right] >= pivot) right--; // 右指针左移,直到遇到比标杆小的值停下
arr[left] = arr[right]; // 将右指针指向的值赋值给左指针指向的值,这样这个比标杆小的值最后就会在标杆的左边
while(left < right && arr[left] <= pivot) left++;// 左指针左移,直到遇到比标杆大的值停下
arr[right] = arr[left];// 将左指针指向的值赋值给右指针指向的值,这样这个比标杆大的值最后就会在标杆的右边
}
arr[left] = pivot; // 到这一步时,左右指针已经相遇,然后将标杆的值赋值给它们相遇的位置即可,这样一来,标杆的左边就都是小于标杆的值,右边都是大于标杆的值
return left; // 返回标杆的下标,对标杆左子表和右子表进行递归即可
}
void _quick_sort(int* arr, int left, int right) //子函数1
{
if(left >= right) return;
int pivotloc = _quick_sort1(arr, left, right); // pivotloc用于记录每次左右子表的分界点
_quick_sort(arr, left, pivotloc-1); // 对左子表进行递归
_quick_sort(arr, pivotloc+1, right); // 对右子表进行递归
}
void quick_sort(int* arr, int len)
{
_quick_sort(arr, 0, len-1);
}