日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

排序算法:直接插入排序算法实现及分析

發布時間:2025/3/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 排序算法:直接插入排序算法实现及分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

直接插入排序算法介紹

還是先過一遍定義。直接插入排序(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; }

運行結果檢測


總結

以上是生活随笔為你收集整理的排序算法:直接插入排序算法实现及分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。