网站首页 > java教程 正文
/**
* 测试随机快速排序
*/
public class TestRandomQuickSort {
public static int partition(int[] arr,int low,int high){
//partition挡板 在low到high范围内设置一个挡板/支点 小于支点元素的数放在s1区 大于支点元素的数放在s2区
int ranCho = (int)((high-low+1)*Math.random()+low);
//随机选low到high之间一位作为支点
int swap ;
swap = arr[low];
arr[low] = arr[ranCho];
arr[ranCho] = swap;
//把支点元素置于首位
int pivot =arr[low];
//pivot支点 小于支点放在s1区 大于支点放在s2区
int s1r = low;
//初期s1区s2区内为空 要将支点右侧所有元素逐个和支点比较 分装进s1 s2内
for (int s2r = low+1;s2r<=high;s2r++){
//先将s2的右端扩张1位 比较这一位和支点 如果比支点大则属于s2不用动 因为已经被s2r包住了
if(arr[s2r]<pivot){
// 比支点小则属于s1 s1右端扩张1位(原属于s2)和正在比的那一位(应属于s1)交换
s1r++;
swap = arr[s1r];
arr[s1r] = arr[s2r];
arr[s2r] = swap;
}
}
//循环结束后 low至high内从左开始依次为 支点pivot s1区(low+1至s1r) s2区(s1r+1至high)
arr[low] = arr[s1r];
arr[s1r] = pivot;
//交换 将支点从low换到s1r位置 这样支点左侧为s1都比支点小 右侧为s2都比支点大
return s1r;
//把支点位置返回
}
public static void rqs(int[] array,int low,int high){
if (low<high){
int pivot = partition(array,low,high);
//用支点分出s1 s2 两个区域再往下分
rqs(array,low,pivot-1);
//s1 这里如果s1区为空 pivot=low 即rqs(array,low,low-1) 如果上面的if(low!=high)就会出问题 low-1!=low执行语句然后报错 错误总结:!=容易遗漏一些例外情况 少用
rqs(array,pivot+1,high);
//s2
}
//low==high 即此区域内只有一个元素时 void此区域排序完成
}
public static void rqs(int[] array){
//重载rqs 用于对整个数组进行排序 调用时不需要输入low=0和high=.length-1
if (array.length>1){
int pivot = partition(array,0,array.length-1);
rqs(array,0,pivot-1);
rqs(array,pivot+1,array.length-1);
}
}
public static void main(String[] args) {
int[] arr = {87,45,32,1,65,98,45,321,5,1,3,5,84,15};
rqs(arr);
System.out.println(Arrays.toString(arr));
//结果[1, 1, 3, 5, 5, 15, 32, 45, 45, 65, 84, 87, 98, 321]
}
}
- 上一篇: java排序大汇总(java几种排序)
- 下一篇: 各种排序的比较、使用场景分析、总结
猜你喜欢
- 2024-10-09 一遍记住 8 种排序算法与 Java 代码实现
- 2024-10-09 java程序员必知的八大排序(java编程排序算法实现)
- 2024-10-09 Java实现堆排序(java堆排序算法代码)
- 2024-10-09 插入排序算法,就这么简单,还学不会算我输
- 2024-10-09 程序员必知的十大基础实用算法之-快速排序算法
- 2024-10-09 【数据结构与算法】十大经典排序算法-快速排序
- 2024-10-09 经常用到的的排序(快速排序和归并排序)简单的计算机算法学习
- 2024-10-09 排序算法——快排(快速排序算法实例讲解)
- 2024-10-09 七种基于比较的排序,基于Java实现,收藏一下?
- 2024-10-09 十大经典排序算法动画与解析,看我就够了!(配代码完全版)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)