几乎有序数组排序
来源:互联网 发布:一级建造师网络教育 编辑:程序博客网 时间:2024/04/30 08:06
题目:
已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离可以不超过k,并且k相对于数组来说比较小。请选择一个合适的排序算法针对这个数据进行排序。
给定一个int数组A,同时给定A的大小n和题意中的k,请返回排序后的数组。
思路:
对于该题目,插入排序能够做到很好效果,时间复杂度O(nk),空间复杂度O(1)
其次就是选择堆起始大小为k的最小堆排序算法,由题意可知a[0~k-1]一定存在整个数组中最小的值,将a[0~k-1]导出最小堆,堆顶放到a0处,a[k]放到最小堆的堆顶,继续建堆,知道剩下最后k个元素,此时随着每次堆顶的弹出,堆的大小k--.
时间复杂度O(nlogk),空间复杂度O(k).理论上说也可以实现原地排序的。
public class Main { public static void main(String[] args) {// TODO Auto-generated method stub int[] B = {2,1,4,3,6,5,8,7,10,9,11,12,14,13,12}; Main m=new Main(); int[] A = m.sortElement(B,15,3); for(int i=0;i<A.length;i++){ System.out.print(A[i]+"\t"); } }public int[] sortElement(int[] b, int n, int k) { // write code hereint[] heap=Arrays.copyOf(b, k);//最小堆数组buildMinHeap(heap,k);//初始最小堆for(int i=k;i<n;i++){//堆的长度为kb[i-k]=heap[0];heap[0]=b[i];buildMinHeap(heap,k);} for(;k>0;k--){//堆的长度不足k b[n-k]=heap[0]; heap[0]=heap[k-1]; buildMinHeap(heap,k); } return b; } public void buildMinHeap(int [] a,int heapsize){ for(int i=(heapsize-1)/2;i>=0;i--){ minHeapify(a,heapsize,i); } } public void minHeapify(int [] a,int heapsize,int i){ int min=i; int left=2*i+1; int right=2*i+2; if(left<heapsize&&a[left]<a[i]) min=left; if(right<heapsize&&a[right]<a[min]) min=right; if(min!=i){ int temp=a[i]; a[i]=a[min]; a[min]=temp; minHeapify(a,heapsize,min); } }}
阅读全文
0 0
- 几乎有序数组排序
- 已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离可以不超过k,并且k相对于数组来说比较小。请选择一个合适的排序算法针对这个数据进行排序。 给定一个int数组A,同时给定
- 排序13:有序数组合并
- 对接近有序的数组排序
- 对接近有序的数组排序 C++
- 数组利用有序链表排序
- 对接近有序的数组排序
- 合并两个有序数组(归并排序)
- 合并两个有序数组并排序
- 对俩个有序数组合并排序
- c++ 数组 有序数组插入 归并排序思想
- 有序数组
- 有序数组
- LeetCode—Merge Sorted Array两个有序数组排序
- hiho1128 非有序数组的二分查找 (快速排序)
- js算法:分治法-归并排序之合并有序数组
- (笔记)数组 插入式排序法 有序查找二分法
- 插入排序和将一个数插入有序数组
- 简单的几步,让php实现邮件发送
- (开坑)在线/离线求lca
- Android自动化测试相关
- 原型模式
- Struts2的类型转换
- 几乎有序数组排序
- gradlew编译时出现Unsupported major.minor version 52.0
- k数和-LintCode
- 存储过程
- 使用service实现通知栏下载支持断点续传
- 通过bcc 使用ebpf
- Linux笔记 命令行
- MFC让对话框窗口始终在最前&MFC弹出非模态对话框
- 一行代码解决各种IE兼容问题