快排改进 解决升序第一个是最大数 降序第一个是最小数问题
2017-08-20 11:14
405 查看
public class ImproveSore { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int[] arr = {9,6,8,7,2,5,1,3,4}; selfSort(arr,0,arr.length - 1); //searchMiddle(arr,0,(0 + (arr.length - 1)) / 2,arr.length - 1); for(int num : arr){ System.out.print(num + " "); } System.out.println(); } /* * 昨天Java实现快排 那个算法 有缺陷 或者说 比较粗糙 * 因为 每次比较 都是 以第一个值 进行 比较的 也就是说 把 第一个值当做标杆 * 如果 数组的第一个 值 恰好是最大值 那么 昨天的算法时间复杂度就是 冒泡排序 这 当然不是 我们想要的 * 下面是 解决方案 */ public static void selfSort(int[] arr,int start,int end){ if(start == end){ return; } int n = start; int m = end; //找出开始 中间 结束 这三个 的中值 然后就避免上面的缺陷缺陷 searchMiddle(arr,start,(start + end) / 2,end); while(start != end){ for(;start < end;end--){ if(arr[end] < arr[start]){ swap(arr,start,end); break; } } for(;start < end;start++){ if(arr[start] > arr[end]){ swap(arr,start,end); break; } } } if(start - 1 > n){ selfSort(arr,n,start - 1); } if(end + 1 < m){ selfSort(arr,end + 1,m); } } /** * 找出三个数中大小的中间数 * @param arr 数组 * @param l 下标值 * @param m * @param n */ public static void searchMiddle(int[] arr,int l,int m,int n){ if(arr[l] > arr[m]){ swap(arr,l , m); } if(arr > arr[m]){ swap(arr,n,m); } if(arr[l] < arr ){ swap(arr,l,n); } } /** * 交换函数 注意 这里 要 传数组的下标 如果 直接传数组值 那么 转变的结果 只在该方法中有效 因为 引用数据类型与 基础数据类型 之间的转变 不一样 * 例如 int a = 10; * int b = a; * b = 1; * 那么 a还是 10 * 如果 int[] arr ={1,2,3}; * int[] arr2 = arr; * arr2[0] = 100; * 那么 arr[0] = 100; * @param arr 要交换的数组 * @param i 要交换的下标 * @param j 要交换的下标 */ public static void swap(int[] arr , int i,int j){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } }
相关文章推荐
- DIV+CSS兼容解决DIV最大宽度和最小宽度问题
- mybatis if test 解决页面 升序和降序的问题
- DIV+CSS兼容解决DIV最大宽度和最小宽度问题
- DIV+CSS兼容解决DIV最大宽度和最小宽度问题
- 【二分答案+贪心】解决“最小值最大”问题(UVa 12124 - Assemble)
- DIV+CSS兼容解决DIV最大宽度和最小宽度问题
- 解决新版本jedate时间插件最小最大时间的选择问题
- WPF DynamicDataDisplay Chart图形控制最大最小可缩放避免崩溃的问题解决代码
- java练习——求数组的最大值、最小值并升序降序排列
- 【Hibernate框架开发之一】搭建Hibernate环境并成功运行第一个项目HelloHibernate并解决3个常出现的运行问题;
- 问题解决——限制窗口的最小尺寸
- 用C++解决:把数组排成最小的数问题
- css使图片自动适应div的宽度变化---解决最大宽度问题
- 【转】关于int范围中负数最小值的绝对值比整数最大值大初学C,问题源自:为什么C中的int类型(16位)的下溢下限为-32768而上溢上限却是32767。 首先说吧,32767很容易理解,32767
- 应用C++ STL以最小堆方法解决Top K 问题
- 回溯法算法思想解决最小机器重量设计问题
- loj6226「网络流 24 题」骑士共存问题(二分图最大点独立集,最小割)
- 用递归法求解一个数组中的最大值和最小值的问题
- hdu 1713 相遇周期 比较绕的最大公约,最小公倍问题
- 如何解决MySQL超过最大连接数问题