ds排序 希爾排序 插入排序演算法 C語言

2021-10-17 09:13:23 字數 2582 閱讀 1786

直接插入排序的基本思想:

假設待排序的記錄存放在陣列 r[1… n] 中。初始時,r[1] 自成1個有序區,無序區為r[2… n]。從 i= 2 起直至 i= n 為止,依次將r[i] 插入當前的有序區r[1... i- 1] 中,生成含 n 個記錄的有序區。

第 i-1 趟直接插入排序:通常將乙個記錄r[i](i= 2,…,n- 1)插入到當前的有序區,使得插入後仍保證該區間裡的記錄是按關鍵字有序的操作,稱為第i-1 趟直接插入排序。排序過程的某一中間時刻,r 被劃分成兩個子區間:r[1… i-1](已排好序的有序區)和 r[i… n](當前未排序的部分,可稱為無序 區)。直接插入排序的基本操作是將當前無序區的第1個記錄 r[i] 插入到有序區r[1… i-1] 中適當的位置上,使 r[1… i] 變為新的有序區。因為這種方法每次使有序區增加 1 個記錄,通常稱為增量法。

插入排序與打撲克時整理手上的牌非常類似。摸來的第1張牌無須整理,此後每次從桌上的牌(無序 區)中摸最上面的1 張並插入左手的牌(有序 區)中正確的位置上。為了找到這個正確的位置,須自左向右(或自右向左)將摸來的牌與左手中已有的牌逐一比較。

#include #include   #define success0#define param_err-1 int insertsort(int * array, int size) int i = 0, j = 0;int insert = 0;int loc = 0;#ifdef debugint k = 0;#endif  for(i = 0; i < size; i++) /*在有序區域查詢合適的插入位置*/loc = i-1; //初始插入位置認為在最後乙個上for(j = i - 1; j >= 0; j--)loc = j;} /*有序區從插入位置向後移動*/for(j = i; j > loc; j--)array[loc] = insert; info:#ifdef debugprintf("i = %d insert = %d, loc = %d", i, insert, loc);printf("[");/*有序區域*/for(k =0; k < i+1; k++)printf("] "); /*無序區域*/printf("[");for(k =i+1; k < size; k++)printf("]");printf("");#endifcontinue;} return success;}  int main(int argc, char ** ar**);int i = 0; printf("before sort: ");for(i = 0; i < 10; i++)printf(""); insertsort(array, 10); printf("after sort: ");for(i = 0; i < 10; i++)printf("");return 0;}
gcc insertsort.c -ddebug

輸出格式

[有序區域][無序區域]

before sort:  7    3    5    8    0    9    1    2    4    6i = 0 insert = 7, loc = 0[  7  ] [  3    5    8    0    9    1    2    4    6  ] i = 1 insert = 3, loc = 0[  3    7  ] [  5    8    0    9    1    2    4    6  ] find loc insert 5 > array[0] = 3i = 2 insert = 5, loc = 1[  3    5    7  ] [  8    0    9    1    2    4    6  ] i = 3 insert = 8, loc = 1[  3    5    7    8  ] [  0    9    1    2    4    6  ] i = 4 insert = 0, loc = 0[  0    3    5    7    8  ] [  9    1    2    4    6  ] i = 5 insert = 9, loc = 0[  0    3    5    7    8    9  ] [  1    2    4    6  ] find loc insert 1 > array[0] = 0i = 6 insert = 1, loc = 1[  0    1    3    5    7    8    9  ] [  2    4    6  ] find loc insert 2 > array[1] = 1i = 7 insert = 2, loc = 2[  0    1    2    3    5    7    8    9  ] [  4    6  ] find loc insert 4 > array[3] = 3i = 8 insert = 4, loc = 4[  0    1    2    3    4    5    7    8    9  ] [  6  ] find loc insert 6 > array[5] = 5i = 9 insert = 6, loc = 6[  0    1    2    3    4    5    6    7    8    9  ]  after sort:  0    1    2    3    4    5    6    7    8    9

排序演算法 插入排序 希爾排序

1 相鄰資料之間相比較。先是1,0 然後2,1 1,0 以此類推 總結 大for從1 n 小for從i 0,之後判斷交換即可 public void charusort for int i 1 i a.length i 2 希爾排序是插入排序特殊化,他不再比相鄰資料,而是可以比較類似1,4,13.的...

插入排序演算法 希爾排序

插入排序演算法 希爾排序 希爾排序思想是將陣列每次分成不同的陣列同時進行排序,劃分的方式是設定增量值,即h length 2,h 2 與直接排序最大的不同就是比較的陣列值下標間隔不同。希爾排序在資料量龐大的時候進行排序效率高,時間短。觀察下圖,根據以上思想,進行移動。如下 include void ...

插入排序 希爾插入排序

本文借鑑於lsgo實驗室創始人馬老師 演算法 希爾插入排序 delta len nums 2 while delta 0 shell delta,nums delta delta 2return nums defshell delta,key for i in range delta,len key...