快速排序---Hoare法

[复制链接]
发表于 2025-12-20 14:41:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
快速排序是Hoare于1962年提出的一种二叉树布局的交换排序方法,其根本头脑为:任取待排序元素序列中的某元 素作为基准值,按照该排序码将待排序聚集分割成两子序列,左子序列中全部元素均小于基准值,右子序列中全部元素均大于基准值,然后最左右子序列重复该过程,直到全部元素都分列在相应位置上为止。
  1. //有个数组arr
  2. int[] arr={6,1,2,7,9,3,4,5,10,8};
复制代码

最左边下标为left 最右边下标为right 
我们先取最左边的数为基准值  tem=arr[0];
right往左走 如果下标的值比tem大,则继续往左走   ,反之制止(相当也制止)
left往右走,如果遇到比tem大的值则停下,然后和right下标的值交换位置,然后right和left继续走;
当left和right下标相遇时,此时它俩的值和tem值交换位置,然后返回此时left大概right的位置下标。此时返回的下标为基准值 key。
我们以key下标为基准值向左和向右分割。左子序列中全部元素均小于基准值,右子序列中全部元素均大于基准值,然后最左右子序列重复该过程,直到全部元素都分列在相应位置上为止。
通过递归算法,相当于一棵二叉树的遍历;

  1. public class Main {
  2.     public static void quick(int[] array,int left,int right){
  3.         if (left>=right)  return ;
  4.         int key = partitionHoare(array,left,right);
  5.         quick(array, left, key);
  6.         quick(array,key+1,right);
  7.     }
  8.     private static int partitionHoare(int[] array, int left, int right) {
  9.         int i=left;
  10.         int tem=array[left];
  11.         while(left<right){
  12.             while(left<right && array[right]>=tem){
  13.                 right--;
  14.             }
  15.             while(left<right && array[left]<=tem){
  16.                 left++;
  17.             }
  18.             swap(array,left,right);
  19.         }
  20.         swap(array,i,left);
  21.         return left;
  22.     }
  23.     private  static void swap(int[] arr ,int a,int b){
  24.         int tem=arr[a];
  25.         arr[a]=arr[b];
  26.         arr[b]=tem;
  27.     }
  28.     public static void main(String[] args) {
  29.         int[] array={2,7,6,3,6,4,8,5};
  30.         quick(array,0,array.length-1);
  31.         for (int i=0;i<array.length;i++){
  32.             System.out.print(array[i]+" ");
  33.         }
  34.     }
  35. }
复制代码
运行效果:


回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表