排序算法:直接插入排序算法实现及分析
直接插入排序算法介紹
還是先過一遍定義。直接插入排序(Straight Insertion Sort)的基本操作是將一個記錄插入到已經排好序的有序表中,從而得到一個新的、記錄數增1的有序表。來我們用通俗一點的話說,就是把數組中元素一個個取出插入到有序表中,直到將數組元素全部插入到有序表中。那么如何構造有序表呢?我們不需要構造,有序表 只是一種形式。當有序表中只有一個元素時,那它肯定是有序的呀。所以我們開始將第0個元素當做有序表。
我們先假定升序。int temp = arr[1]與有序表的最大值arr[0]進行比較,arr[1]<arr[0]那么arr[0]就往后挪,挪到arr[1]的位置,此時temp 和 有序表中的第二個最值進行比較,發現和有序表比較完了,temp 就放到arr[0]處唄。
現在我們假定有序表中已經有多個元素了。我們取到數組中的第i個數組元素,往 0~ i-1 的有序表中進行插入,它的比較過程如下:跟有序表的最大值arr[i-1]比較,發現比最大值小,將最值arr[i-1]往前挪,繼續和有序表中第二大的值arr[i-2],進行比較,如果還是發現比它小,這有序表中的第二大的值arr[i-2]繼續往前挪,繼續進行比較直到找到有序表中第j個元素比當前元素要小或者將有序表找完了。將當前元素放到j+1的位置,這樣就找到了第i元素要插入的位置了。
直接插入排序算法代碼
//直接插入排序 升序 void InsertSort_Up(int* arr, int length) {//假定第0個元素是有序表,從第1個元素開始往有序表中插入數據for (int i = 1; i < length; i++){int temp = arr[i];int j;for (j = i - 1; j >= 0 && arr[j] > temp; j--){arr[j + 1] = arr[j];//往前挪}arr[j + 1] = temp;}return; }直接插入排序算法時間復雜度分析
我們考慮最壞的情況,當數組完全逆序的時候比如{6,5,4,3,2,1}這種情況,我們進行升序排序,我們比較的次數:1+2+3+4+5,數據移動的次數:1+2+3+4+5。擴展到n個元素的數組 比較次數:1+2...+n-1 = n*(n-1)/2,移動的次數同樣為n*(n-1)/2,所考慮數據隨機的情況,時間復雜度為(n^2 -n)/2 = O(n^2)。從這里可以看出同樣的O(n^2)時間復雜度,直接插入排序比選擇排序和冒泡排序性能要要一些。直接插入排序對數組基本有序和數組元素比較少的時候,速度比較快。
完整代碼
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <time.h> #include <sys/timeb.h> #define MAXSIZE 20 #define MAXNUM 21 //交換值 void Swap(int* a, int* b) {int temp = *a;*a = *b;*b = temp; } //直接插入排序 升序 void InsertSort_Up(int* arr, int length) {//假定第0個元素是有序表,從第1個元素開始往有序表中插入數據for (int i = 1; i < length; i++){int temp = arr[i];int j;for (j = i - 1; j >= 0 && arr[j] > temp; j--){arr[j + 1] = arr[j];//往前挪}arr[j + 1] = temp;}return; } //直接插入排序 降序 void InsertSort_Down(int* arr, int length) {//假定第0個元素是有序表,從第1個元素開始往有序表中插入數據for (int i = 1; i < length; i++){int temp = arr[i];int j;for (j = i - 1; j >= 0 && arr[j] < temp; j--){arr[j + 1] = arr[j];//往前挪}arr[j + 1] = temp;}return; } //打印數組元素 void PrintArr(int* arr, int length) {for (int i = 0; i < length; i++){printf("%d ", arr[i]);}printf("\n");return; }int main(int argc, char *argv[]) {srand((size_t)time(NULL));//設置隨機種子int arr[MAXSIZE] = { 0 };//給每個元素設置一個隨機值for (int i = 0; i < MAXSIZE; i++){int num = rand() % MAXNUM;arr[i] = num;}printf("排序前:\n");PrintArr(arr, MAXSIZE);printf("直接插入排序升序:\n");InsertSort_Up(arr, MAXSIZE);PrintArr(arr, MAXSIZE);printf("直接插入排序降序:\n");InsertSort_Down(arr, MAXSIZE);PrintArr(arr, MAXSIZE);return 0; }運行結果檢測
總結
以上是生活随笔為你收集整理的排序算法:直接插入排序算法实现及分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QT5_PYQT导入自己的图片
- 下一篇: C 控制父、子进程的先后顺序执行