package com.ykp.test;
/**
* 快速排序:快速排序采用的思想是分治思想。
*
* 快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值
* 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正
* 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。
*/
public class QuickSortTest {
public static void quicksort(int[] arr, int left, int right) {
if (left < right) {
int low = left;// 低指针
int high = right;// 高指针
int key = arr[low];// 基准的值
// 如果低指针的值不小于高指针的值的时候,结束本次排序
while (low < high) {
// 首先扫描高指针,从右向左扫描,在low < high的前提下,
// 如果遇到比基准key小的值,则停止扫描,并且把这个小的值放到low所在的位置
while (low < high && arr[high] >= key) {
high--;
}
// 把右边比基准小的放到左边
arr[low] = arr[high];
// 然后扫描低指针,从左向右扫描,在low < high的前提下,
// 如果遇到比基准key大的值,则停止扫描,并且把这个大的值放到high所在的位置
while (low < high && arr[low] <= key) {
low++;
}
// 把左边比基准大的放到右边
arr[high] = arr[low];
}
// 把基准的值放到中间的位置
arr[low] = key;
// 对左侧进行再次排序
quicksort(arr, left, low - 1);
// 对右侧再次进行排序
quicksort(arr, low + 1, right);
}
}
public static void main(String[] args) {
int arr[] = { 22, 56, 54, 1, 98, 9, 22, 26 };
quicksort(arr, 0, arr.length - 1);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}
快速排序
最新推荐文章于 2024-07-17 10:35:12 发布