小范围排序
2016-01-11 10:43
483 查看
已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离可以不超过k,并且k相对于数组来说比较小。请选择一个合适的排序算法针对这个数据进行排序。
给定一个int数组A,同时给定A的大小n和题意中的k,请返回排序后的数组。
测试样例:
[/code]
给定一个int数组A,同时给定A的大小n和题意中的k,请返回排序后的数组。
测试样例:
[2,1,4,3,6,5,8,7,10,9],10,2
返回:[1,2,3,4,5,6,7,8,9,10] 具体解法:使用堆排序改进每次建立一个i到k-1+i的小根堆然后弹出最小的值。 [code]public static void sort(int[] pq) { int N = pq.length; int k=5; int flag=k; //把最小的在跟顶 while (flag<=N) { for (int i = k / 2; i >= 1; i--) sink(pq, i, k, flag - k);//构造 flag++; } flag-=k; for (int i = k-1; i >=2 ; i--) { for (int j = i / 2; j >= 1; j--) sink(pq,j,i,flag); flag++; } } /*************************************************************************** * Helper functions to restore the heap invariant. ***************************************************************************/ private static void sink(int[] pq, int k, int N,int flag) { while (2*k <= N) { int j = 2*k; if (j < N && !less(pq, j+flag, j+flag+1)) j++; if (less(pq, k+flag, j+flag)) break; exch(pq, k+flag, j+flag); k = j; } } /*************************************************************************** * Helper functions for comparisons and swaps. * Indices are "off-by-one" to support 1-based indexing. ***************************************************************************/ private static boolean less(int[] pq, int i, int j) { return pq[i-1]<(pq[j-1]) ; } private static void exch(int[] pq, int i, int j) { int swap = pq[i-1]; pq[i-1] = pq[j-1]; pq[j-1] = swap; } // is v < w ? /*************************************************************************** * Check if array is sorted - useful for debugging. ***************************************************************************/ private static void show(int[] a){ for (int i = 0; i <a.length ; i++) { System.out.print(a[i] + " "); } System.out.println(); } /** * Reads in a sequence of strings from standard input; heapsorts them; * and prints them to standard output in ascending order. */ public static void main(String[] args) { int[] numbers=new int[10]; Scanner in=new Scanner(System.in); for (int i = 0; i < 10; i++) { numbers[i]=in.nextInt(); } sort(numbers); show(numbers); }
[/code]
相关文章推荐
- 注解形式开发Controller方法的返回值类型
- win7的目录和vbox的共享,linux中没有权限打开
- java内存计算
- Jmter相关组件用法
- ABAP 使用向导创建TABLE CONTROL (TC 表控件)
- 进退法例子
- Java中的Abstract关键字的使用注意点
- iOS性能优化之内存管理:Analyze、Leaks、Allocations的使用和案例代码
- 分享一下我封装iOS自定义控件的体会,附上三个好用的控件Demo &lt;时间选择器&amp;多行输入框&amp;日期选择器&gt;
- 仿照微信的效果,实现了一个支持多选、选原图和视频的图片选择器,适配了iOS6-9系统,3行代码即可集成.
- GET POST 区别详解
- 基于HTML5 SVG和Raphaël.js的混合图标动画特效插件教程
- Mysql 安全管理
- rocketmq
- WEB压测工具之siege
- c语言swap函数总结
- 眉目传情之匠心独运的kfifo
- 隐藏actionBar, 报错 getActionBar.hide() 运行时java.lang.NullPointerException
- 重复安装GI的时候报错INS-32025
- 一个简单的3DTouch、Peek和Pop手势Demo,附github地址