查看: 2949| 回复: 9
收起左侧

特殊数组排序

wwwyhx | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   177
88%
12%
25

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
给个数组,没排序,已知数组中每个元素距离排序以后的位置最多是k,让你给这个
数组排序

上一篇:三分数组
下一篇:C++基础题,小疑问求解
Imbalism 2011-9-24 13:39:19 | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   42
100%
0%
0
从1开始,往下找k个数,把最小的和1调换.
以此类推
感觉应该是这样
回复

使用道具 举报

Imbalism 2011-9-24 13:39:46 | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   42
100%
0%
0
这样复杂度就是O(K * N)
回复

使用道具 举报

 楼主| wwwyhx 2011-9-25 10:03:42 | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   177
88%
12%
25
这样复杂度就是O(K * N)
Imbalism 发表于 2011-9-24 13:39



    用大小为k+1的堆, 每次pop一个压入一个

  1. bool Pred(int a, int b)
  2. {
  3.         return a > b;
  4. }

  5. void ReSort(int a[], int n, int k)
  6. {
  7.         assert(a && n > 0 && k > 0 && k < n);

  8.         int* pHeap = new int[k];
  9.         for (int i = 0; i < k; i++)
  10.                 pHeap[i] = a[i];

  11.         make_heap(pHeap, pHeap + k, Pred);

  12.         for (int i = k; i < n; i++)
  13.         {
  14.                 pop_heap(pHeap, pHeap+k, Pred);
  15.                 a[i-k] = pHeap[k-1];
  16.                 pHeap[k-1] = a[i];
  17.                 push_heap(pHeap, pHeap+k, Pred);
  18.         }

  19.         sort_heap(pHeap, pHeap+k, Pred);

  20.         for (int j = k; j >= 1; j--)
  21.                 a[n - j] = pHeap[j - 1];
  22.         delete []pHeap;
  23. }
复制代码
回复

使用道具 举报

ilhrx 2011-10-3 13:31:28 | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   20
100%
0%
0
回复 1# wwwyhx


    我首先想到的是希尔排序。。。
但排序这种东西应该是殊途同归吧。。。
难道最优的复杂度是

O(n/K* log n)么。。。
回复

使用道具 举报

ilhrx 2011-10-3 13:35:48 | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   20
100%
0%
0
最简单的应该是冒泡吧。。。
比如最大的数肯定在前K+1个里面,那就对前k+1个数冒泡一趟
冒出来第一个后,第二大的数肯定在2到K+2里面。。。
O(n*k)
回复

使用道具 举报

 楼主| wwwyhx 2011-10-4 01:10:07 | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   177
88%
12%
25
最简单的应该是冒泡吧。。。
比如最大的数肯定在前K+1个里面,那就对前k+1个数冒泡一趟
冒出来第一个后,第二大的数肯定在2到K+2里面。。。
O(n*k)
ilhrx 发表于 2011-10-3 13:35



    没必要排序啊,可以参考2楼的,每次调换以后数组还是保留那个k范围的性质,但是数组缩小了一个,是收敛的
回复

使用道具 举报

ilhrx 2011-10-4 09:22:59 | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   20
100%
0%
0
回复 7# wwwyhx

二楼应该跟我的意思是一样的。。。
就是前k个里面就能找到最小的
然后依次类推。
回复

使用道具 举报

Imbalism 2011-10-4 10:07:15 | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   42
100%
0%
0
回复 8# ilhrx
en ,lou zhu de fangfa hen qiao miao, wo da yi le
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表