思想:插入排序的思想是將乙個無需的數列中的資料挨個插入到乙個已經有序的數列中,使得插入後原本有序的數列依然有序,最終完成整個數列的排序。在實際的排序過程中,「已經有序的數列」指的是數列中被拍好序的部分。考慮對下圖的陣列進行插入排序:
首先考慮6這個元素,因為第乙個元素8只有它自己,是已經排好序的。
考慮6時將6這個元素插入到有序部分「8」中,6應該在8的前面,因此這一步結束後陣列為
接下來考慮2這個元素,此時陣列中有序部分為「8 6」,將2插入到有序部分中的合適位置,結果為
下一步再考慮3這個元素,此時陣列中有序部分為「2 6 8」,將3插入到其中的合適位置結果為
以上過程是插入排序的思想,演算法共兩層迴圈,外層迴圈負責遍歷陣列的元素,內層迴圈負責將外層迴圈選中的第i個元素在有序部分中找到合適的位置。在找位置進行插入的過程中有兩種做法,考慮上面倒數第二幅圖:一種是將3和8交換,再將3和6交換,完成對3的插入排序;另一種是將3暫存,8比3大則將8後移乙個位置,繼續判斷6也比3大,那麼將6後移乙個位置,繼續判斷2不大於3,因此將3插入到2後面。兩種方法中,第一種每次交換相當於3次賦值操作,而第二種方法則只是一次賦值,因此效率會高一些。
最後,相比與選擇排序,由於選擇排序的內層迴圈每次要找到剩餘元素的極值索引,因此需要內層迴圈完全執行才能結束,而插入排序的內層迴圈,一旦找到了合適的位置就會提前結束,因此效率會更高。實際上,對於乙個近乎有序的陣列,插入排序的效率是非常高的。
希爾排序也是一種插入排序演算法,是上文的插入排序演算法的改進後的版本,該演算法的複雜度突破了o(n^2)。
思想:將待排序的陣列分組進行插入排序,通過乙個增量將陣列元素劃分為若干組分別進行排序。逐步減小增量,繼續按組進行分組排序,直至增量為1。還是看圖比較容易懂啊,gap為增量!
// created by 開機燙手 on 2018/4/19.
//#ifndef sort_sorttesthelper_h
#define sort_sorttesthelper_h
#include #include #include using namespace std;
namespace sorttesthelper
return arr;
}templatevoid printarray(t arr, int n)
cout << endl;
}templatebool issorted(t arr, int n)
return true;
}templatevoid testsort(string name, void(*sort)(t , int n), t arr, int n)
int *copyintarray(int a, int n)
return arr;
}};#endif //sort_sorttesthelper_h
main.cpp
#include #include "sorttesthelper.h"
using namespace std;
templatevoid insertsort(t k, int len)
k[j] = temp;}}
}templatevoid shellsort(t k, int len)
k[j] = temp;}}
}}int main()
輸出:
insert sort: 3.024 s
shell sort: 0.019 s
插入排序和希爾排序
插入排序的基本操作就是將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的 個數加一的有序資料,演算法適用於少量資料的排序,插入排序的基本思想是 每步將乙個待排序的紀錄,按其關鍵碼值的大小插入前面已經排序的檔案中適當位置上,直到全部插入完為止。public static void sortins...
插入排序和希爾排序
1.首先,排序按類來分有插入排序 選擇排序 交換排序和歸併排序,而插入排序又分為直接插入排序和希爾 shell 排序 選擇排序類又分為選擇排序和堆排序,交換排序分為氣泡排序和快速排序,今天主要分享插入排序和希爾排序。2.插入排序概念 插入排序 對乙個陣列中的數,比較大小,假設它是公升序排列,認為它的...
插入排序和希爾排序
author shenqi date 2018 1 15.插入排序 每步將乙個待排序的記錄,按其順序碼大小插入到前面已經排序的字序列的合適位置 從後向前找到合適位置後 直到全部插入排序完為止。從第乙個元素開始,該元素可以認為已經被排序 取出下乙個元素,在已經排序的元素序列中從後向前掃瞄 如果該元素 ...