快速排序算法
介绍
快速排序算法,是一种基于分治法的交换排序算法:在待排序表L[1…n]中任取一个元素pivot作为基准(通常取首元素为基准),通过一趟排序将待排序表根据基准划分为两个部分:L[1… i - 1]与L[i + 1…n],其中L[i]为pivot基准元素,其中在L[1… i - 1]这一部分的所有元素都小于基准值pivot,L[i + 1…n]这一部分全都大于或者等于基准值pivot。称这过程为一次划分,然后分别递归此函数,操作两边的部分,直到每个部分内只有一个元素或者每个部分为空,为函数的退出条件。
Java代码实现:
/**
* @param arr 待排序数组
* @param start 低位指针
* @param end 高位指针
*/
private static void quickSort(int[] arr, int start, int end) {
// {4, 6, 10, 7, 3, 8, 5, 44, 2}; 测试数据
// 低位指针大于高位指针,标识数组为有序数组
if (start >= end) return;
// 存放基准数据
int standard = arr[start];
int low = start, high = end;
while (low < high) {
while (arr[high] >= standard && low < high) {
// 高位指针--
high--;
}
// 高位指针处的数据小于低位的,则高位的数据应该在地位,复制过去
arr[low] = arr[high];
// 当低位指针小于高位指针时,标识遍历完整个数据
while (arr[low] <= standard && high > low) {
// 低位指针++
low++;
}
// 低位指针处的数据大于高位的,则低位的数据应该在高位,复制过去
arr[high] = arr[low];
}
// 将基准量数据放回去
arr[low] = standard;
// 递归小于基准量的低位数据
quickSort(arr, start, high);
// 递归大于基准量的高位数据
quickSort(arr, low + 1, end);
}
C代码实现:
逻辑与Java一致
void quick_sort(int arr[], int start, int end)
{
if (start >= end)
{
return;
}
// 取首元素作为基准值
int low = start, high = end, pivot = arr[start];
while (low < high)
{
//
while (arr[high] >= pivot && low < high)
{
high--;
}
arr[low] = arr[high];
while (arr[low] <= pivot && low < high)
{
low++;
}
arr[high] = arr[low];
}
arr[low] = pivot;
// 开始递归
quick_sort(arr, start, low);
quick_sort(arr, low + 1, end);
}