首先來看比較簡單的選擇排序(selection sort),插入排序(insertion sort),然後在分析插入排序的特徵和缺點的基礎上,介紹在插入排序基礎上改進的希爾排序(shell sort)。
一 選擇排序
原理:現在假設我們給乙個隊伍排序。首先我們找到那個最矮的叫他站第一位,再找出第二矮的叫他站第二位,以此類推。既然是根據身高排序,那麼我們是不是還應該有乙個參照物,現在我們就假設最左邊的同學的公升高作為參照,一旦找到了就叫最矮的同學和最左邊的這位同學交換位置,排完第乙個後,我們又應該排第二個了,現在我們又以左數第二個同學作為參照,一次類推。選擇排序就是這種排序方法。
[20:59:31] cat selectsort.c
#include
int main()
; int
length=sizeof(a)/sizeof(a[0]);
for(i=0;i}
}for(i=0;iprintf("%d ",a[i]);
printf("\n");
return0;}
[20:59:38] gcc selectsort.c
[20:59:42] ./a.out01
2345
6789
二 插入排序
原理:我們可以假想選擇排序為打牌,我們打牌時每得到一張牌,正常情況下我們都會先給牌排序的對嗎。現在我們手裡有四張牌,從左到右分別為1349,那麼現在剛好有拿了一張5,我們是不是應該把5放在3和4直接。選擇排序也是如此,每得到乙個數,就把它插到正確的位置上,有一點需要注意,就是我們找到那個位置後,還需要把前面比它大的數往後挪乙個位置,空出乙個位置用來存放剛得到的數
選擇排序很簡單,他的步驟如下:
[20:19:47] vi selectsort.c
[20:24:39] cat selectsort.c
#include
int main()
; int len=sizeof(a)/sizeof(a[0]);
for(i=0;i1;i++)
a[j+1]=min;//move x to the right location}}
for(i=0;i//sort end
printf("%d ",a[i]);
printf("\n");
return0;}
[20:24:46] gcc selectsort.c
[20:24:49] ./a.out01
2345
6789
[20:24:51]
三 希爾排序(shell sort)
原理:這個排序方法是根據步長來進行排序的,每次比較的步長越小,序列就越有序。這個我講不清楚,我經常搞錯的地方就是步長的比較次數那裡,正確的方法是比較陣列的長度減去步長大小的次數,比較完一次之後,還要從頭開始再比較,知道陣列裡的資料全部都是安裝步長數排好的
[23:12:03] vi shellsort.c
[23:20:06] gcc shellsort.c
[23:20:09] ./a.out01
2345
6789
[23:20:11] cat shellsort.c
#include
int main()
; int
length=sizeof(a)/sizeof(a[0]);
while(hh=h*2+1;//sure step,the biggest step,+1 is for sure last step is 1,the biggest step is length/2
while(h>=1)//circle step}}
h=h/2;
}for(i=0;iprintf("%d ",a[i]);
printf("\n");
return0;}
[23:20:18]
資料結構 四 常用排序演算法 選擇 插入 希爾
選擇排序 實現思路 1 將需排序的集合設為a,已經排好順的集合為b 在未排序前b集合為空 2 每次從a集合中查詢出最大或者最小的元素後放入集合b中 3 同時將該元素從集合a中移除.4 迴圈執行以上兩步直到集合a為空,b集合中的元素就有序了.缺點 效率低,時間複雜度為 o n n 是一種只適合小資料集...
資料結構與演算法 選擇排序,插入排序
選擇排序 原理 每次選擇最大的或最小的乙個放在最前面後最後面 時間複雜度 o n 2 空間複雜度 o 1 不穩定排序 選擇排序 public static void selectsort int list int temp list minindex list minindex list i lis...
資料結構與演算法 希爾排序
希爾排序又稱縮小增量排序,實質上是分組直接插入排序。為了方便理解,先不討論如何獲得合適的增量陣列和整個演算法的 1 修改直接插入排序的 實現增量為gap的直接插入排序。將陣列從start到end中間隔為gap的子串行進行直接插入排序 private static void straightinser...