shell sort
来源:互联网 发布:网站数据库培训 编辑:程序博客网 时间:2024/06/06 05:27
Algorithm Gossip: Shell 排序法 - 改良的插入排序
說明
插入排序法由未排序的後半部前端取出一個值,插入已排序前半部的適當位置,概念簡單但速度不快。排序要加快的基本原則之一,是讓後一次的排序進行時,儘量利用前一次排序後的結果,以加快排序的速度,Shell排序法即是基於此一概念來改良插入排序法。
解法
Shell排序法最初是D.L Shell於1959所提出,假設要排序的元素有n個,則每次進行插入排序時並不是所有的元素同時進行時,而是取一段間隔。Shell首先將間隔設定為n/2,然後跳躍進行插入排序,再來將間隔n/4,跳躍進行排序動作,再來間隔設定為n/8、n/16,直到間隔為1之後的最 後一次排序終止,由於上一次的排序動作都會將固定間隔內的元素排序好,所以當間隔越來越小時,某些元素位於正確位置的機率越高,因此最後幾次的排序動作將 可以大幅減低。
舉個例子來說,假設有一未排序的數字如右:89 12 65 97 61 81 27 2 61 98
數字的總數共有10個,所以第一次我們將間隔設定為10 / 2 = 5,此時我們對間隔為5的數字進行排序,如下所示:
畫線連結的部份表示 要一起進行排序的部份,再來將間隔設定為5 / 2的商,也就是2,則第二次的插入排序對象如下所示:
再來間隔設定為2 / 2 = 1,此時就是單純的插入排序了,由於大部份的元素都已大致排序過了,所以最後一次的插入排序幾乎沒作什麼排序動作了:
後來還有人證明有其它的間隔選定法可以將Shell排序法的速度再加快;另外Shell排序法的概念也可以用來改良氣泡排序法。
void shellSort(vector<int>& number){ int gap = number.size() / 2; while(gap > 0) { for(int k = 0; k < gap; k++) { for(int i = k+gap; i < MAX; i+=gap) { for(int j = i - gap; j >= k; j-=gap) { if(number[j] > number[j+gap]) { SWAP(number[j], number[j+gap]); } else break; } } } gap /= 2; }}
- shell sort
- shell sort
- shell sort
- shell sort
- shell sort
- shell sort
- Shell Sort
- shell sort
- shell sort
- shell sort
- shell sort
- Shell Sort
- Shell Sort
- Shell Sort
- Shell Sort
- [shell]sort
- shell sort
- (转)SHELL SORT
- MyEclipse 自动补全
- java map 遍历
- 五子棋棋子透明显示在棋盘
- How to make your own maps/tiles
- arcsde服务esri_sde无法启动之解决办法
- shell sort
- Linux Kernel Panic报错解决思路
- 双系统修改 Ubuntu 启动顺序
- C#打印分页
- HDU 1030 Delta-wave
- Android中View的绘制过程
- Android软键盘显示模式及打开和关闭方式
- Linux内存泄漏与溢出
- android设置横屏