冒泡排序(bubble sort) ― O(n2) 鸡尾酒排序 (Cocktail sort, 双向的冒泡排序) ― O(n2) 插入排序 (insertion sort)― O(n2) 桶排序 (bucket sort)― O(n); 计数排序 (counting sort) ― O(n+k); 合并排序 (merge sort)― O(n log n); 原地合并排序 ― O(n2) 二叉排序树排序 (Binary tree sort) ― O(n log n)期望时间; O(n2)最坏时间; 鸽巢排序 (Pigeonhole sort) ― O(n+k); 基数排序 (radix sort)― O(n?k); 选择排序 (selection sort)― O(n2) 希尔排序 (shell sort)― O(n log n) 堆排序 (heapsort)― O(n log n) 快速排序 (quicksort)― O(n log n) 期望时间, O(n2) 最坏情况;

2010暑期兴趣班之排序专题


参加竞赛人数
 54
解答题目人数
 52
创建者
开始时间
2010-07-28 12:00:00.0
结束时间
2010-07-30 11:00:00.0
当前时间
2024-07-07 22:40:53
状态
已结束

题库:

题目号
标题
正确率(正确/总提交)
正确解答人数
提交人数
最佳解决(者)
A
74%( 46/ 62)
44
44
0MS/zjz
B
57%( 40/ 70)
40
40
0MS/cyj
C
40%( 25/ 62)
24
30
359MS/ff
D
43%( 7/ 16)
7
10
E
75%( 3/ 4)
3
4
F
46%( 12/ 26)
12
16
0MS/lll7
G
61%( 29/ 47)
28
30
0MS/cyj
H
28%( 6/ 21)
5
8
6MS/patch
I
57%( 45/ 78)
39
39
0MS/likaer

解题报告:
该解题报告由helihui提供:

A题:简单题。直接在一串里面处理稍微麻烦点。最简单直观的方法可以。把Z,O,J,7提取出来分在一个字符数组,对此字符串排序。另外按照原顺序放在另外一个字符数组。然后依次输出就行。

B题当然也是简单题目,也是根据描述,求出每行的measure 的值,然后排序。输出即可。

C题:归并可以。我用的是树状数组+离散化解决的。首先将问题转化,最小交换次数的等于各个数前比当前数大的个数的总和。
例如:
5
9
1
0
5
4
这组样例。  9前没有比它大数,1前有两个比它大,0前面有2个,5前面有1个,4前有2个。
所以一共 1+2+1+2 = 6
就是这样算出来的。n < 500,000 这个规模直接模拟时间复杂是O(n^2) 可想而知肯定超时。
这个题目转化后,非常常规的树状数组的应用,树状数组时间复杂度是n*logn
最坏情况运算9500000次  还是可以接受的。
树状数组操作是向下更新向上统计
注意下要统计的交换次数可能很大 需要用__int64

D,E,F,未做

G题还是比较简单,分开排序就可以。但是要记录下原来序列的位置是数字还是word。把排序好的根据位置的类型将数据放入该位置。然后输出这列序列就行。

H:题目最长递减非连续子序列应用。但是运用前需要处理下原序列。
开进来的车子可以放头,也可以放尾。那么我们所有可能的组合在一起运用最长递减非连续子序列就行了。
例:
3
1
2
3

1 2 3进来,我们处理成:3 2 1 2 3  然后运用最长递减非连续子序求出即可。说明下这里开始处理非排序,而是把原数列倒置再连到原数列前面组成一列。

I题:分割后,先判断长度,等的话strcmp比较排序。 可以把这些写在QSORT的仿函数cmp里。
int cmp(const void *a,const void *b)
{
      int t = strlen((char *)a)-strlen((char *)b);
      if(t==0)//如果长度相同
      {
              return strcmp((char *a),(char *)b);
       }
       return t;//如果不相等就按照长度排序
}

|返回 |   | 转到页头|
Copyright @ 2008-2024(浙ICP备2022001332号), TZOJ. All Rights Reserved.