public class Test {
public static void main(String args[]) {
int[] a = { 10, 32, 1, 9, 5, 7, 12, 0, 4, 3 };
System.out.print("排序前: ");
for (int i = 0; i < a.length; i++)
System.out.print("\t" + a[i]);
System.out.println();// 换行
quickSort(a,0,a.length-1); // 希尔排序
System.out.print("排序后: ");
for (int i = 0; i < a.length; i++)
System.out.print("\t" + a[i]);
}
/**
* 快速排序算法思想:快速排序是对冒泡排序的一种改进,它不再是对相邻元素进行比较大小,而是与一个基准元素进行比较。
* 每完成一轮比较,不仅基准元素的位置已经确定,其他元素的大概位置也确定了(位于基准元素左侧还是右侧),因而具有较高的效率。
* 以升序排列为例,快速排序法取数组中的任意元素(习惯取第一个)为基准,将原数组分成两部分。
* 大于基准元素的部分全部位于基准元素右侧,小于基准元素的部分全部位于基准元素左侧。
* 然后继续按照这样的思想将左右两侧的数组分别取新的基准元素分成两部分,直到最终排序完成。
* 快速排序算法的实现:以升序排列为例,取开端的元素为基准元素。用一个临时变量保存基准元素temp=array[0]。
* 从数组末端向前遍历,找到第一个小于temp的元素,把它赋值给基准元素所在位置的元素。
* 然后从数组前端向后遍历,找到第一个大于temp的元素,把它赋值给向前遍历时停下来的位置的元素。
* 重复“从后向前找一个小于temp的元素,赋值给从前向后遍历停止时的位置,从前向后找一个大于temp的元素,赋值给从后向前遍历停止时的位置”这一过程。
* 需要注意,无论向前还是向后遍历,都要保证向前遍历时的下标小于向后遍历时的下标,否则应该停止遍历。
* 第一趟比较全部完成之后,对于分成的两个数组,递归调用相同的方法继续比较,直到数组不可再分,得到的就是最终结果
*/
public static void quickSort(int[] array,int low,int high) {
if (low < high) {
int split = sort(array, low, high);//把a数组中下标从low到high的部分用快速排序的思想进行一次排序,返回基准元素最终的位置(索引)
quickSort(array, low, split - 1);//一次排序后左侧的部分重新按照快速排序的思想排序
quickSort(array, split + 1, high);//一次排序后右侧的部分重新按照快速排序的思想排序
}
}
public static int sort(int[] array,int low,int high){
int temp = array[low];
while (low < high) {
while (low < high && array[high] >= temp)//从后向前查找第一个小于temp的元素
high--;
array[low] = array[high];
while (low < high && array[low] <= temp)//从前向后查找第一个大于temp的元素
low++;
array[high] = array[low];
}
array[low] = temp;//一次排序完成后定位基准元素的位置
return low;//返回基准元素的位置坐标,用于递归排序基准元素左右的数组
}
}
快速排序法学习心得
最新推荐文章于 2024-08-13 09:00:00 发布