在线编程--小范围排序
来源:互联网 发布:打印机接网络就死机 编辑:程序博客网 时间:2024/05/01 23:36
小范围排序是指一个几乎有序的数组,个别元素需要进行调整,但调整的幅度不超过k,k相对于整个数组很小。
思想:可以使用插入排序,时间复杂度不超过O(N*k)
最好方法是使用堆排序,建立一个k大小的堆,对数组依次进行排序。
题目:
已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离可以不超过k,并且k相对于数组来说比较小。请选择一个合适的排序算法针对这个数据进行排序。
给定一个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]
import java.util.*;public class ScaleSort { public int[] sortElement(int[] A, int n, int k) { // write code here if (A == null || A.length < 1 || n < k) { return A; } int[] heap = getHeap(A, k); // 先建立一个k大小的小根堆 for (int i = k; i < n; i++) { A[i - k] = heap[0]; // 将调整好的heap[0]转入A数组内 heap[0] = A[i]; // 将下一个元素放入heap数组中 进行调整 heapify(heap, 0, k); } // 此时堆内还剩下一些元素 进行排序 for (int i = n - k; i < n; i++) { A[i] = heap[0]; swap(heap, 0, k - 1); heapify(heap, 0, --k); } return A; } // 初始化k大小的小根堆 public static int[] getHeap(int[] A, int k) { int[] heap = new int[k]; for (int i = 0; i < k; i++) { insertHeap(heap, A[i], i); } return heap; } // 插入值 public static void insertHeap(int[] heap, int value, int i) { heap[i] = value; while (i != 0) { int parent = (i - 1) / 2; if (heap[parent] > heap[i]) { swap(heap, parent, i); i = parent; } else { break; } } } public static void swap(int[] arr, int index1, int index2) { int tmp = arr[index1]; arr[index1] = arr[index2]; arr[index2] = tmp; } /* * index 对下标为index的元素进行调整 heapSize heap堆的大小 最后剩余的堆需要输出 */ public static void heapify(int[] heap, int index, int heapSize) { int left = index * 2 + 1; int right = index * 2 + 2; int min = index; while (left < heapSize) { if (heap[left] < heap[index]) { min = left; } if (right < heapSize && heap[right] < heap[min]) { min = right; } if (min != index) { swap(heap, min, index); } else { break; } index = min; left = index * 2 + 1; right = index * 2 + 2; } }}
0 0
- 在线编程--小范围排序
- 小范围排序
- 小范围排序
- 小范围排序
- 小范围排序
- 小范围排序练习题
- 小范围排序
- 小范围排序-------------->_<
- 小范围排序
- 小范围排序
- 排序11:小范围排序
- 小范围排序(C++)
- 范围查询(Range)-----学堂在线编程题
- 小范围排序 --使用堆排序
- 小范围排序(堆排序)
- 小范围排序(巧用堆排序) -- 算法小结
- 海量小范围数据排序(位图)
- 在线编程--双栈排序
- 计算机视觉测试数据集 dataset
- 使用Vsftpd服务传输文件。
- DOG角点检测——opencv实现
- 通过构造函数创建的对象的原型指向构造函数的prototype属性
- Learning Kalman filter
- 在线编程--小范围排序
- 作品展示
- Spring整体架构
- JDK7的Comparison method violates its general contract异常
- hdu2609 字符串的最小表示法模版
- 映射文件中的关联关系——多对一/一对多sh
- C++第6次实验(基础班)—数组2
- android视频播放
- 算法导论之贪心算法:活动选择问题