NOJ - T0??
[編輯] [转简体] (简体译文)
|
作者:huidong
| 分類:【編程】C 程序設計課程
[
14 瀏覽
0 評論
3 贊
4 踩
]
概要
循環排序
正文
这题我看了好半天,感觉 NOJ 对这个排序算法的描述有逻辑错误,且语义不明造成理解混乱。我觉得循环排序的意思就是这样:
1. 令 i = 0
2. 遍历 arr[i+1~end],找到有多少元素小于 arr[i],记为 pos
3. 若 pos == 0,那就说明 arr[i] 位置正确,令 i++,然后重复步骤 2,直到排完所有元素;若 pos > 0,则将 arr[i] 放到 arr[i+pos] 位置上,原先的 arr[i+pos] 被挤出来,那么把它放到 arr[i] 位置上,然后重复步骤 2。
事实上还可以做一点优化,即 arr[i+pos] 和 arr[i] 可以不需要换位,只需要引入一个 temp 变量临时存储每一次被挤出来的 arr[i+pos] ,然后用来进行步骤二的比较就行,这样就可以更好地满足循环排序的原本用途:最小化写入次数,以减少对昂贵存储器的损耗。