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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2025/3/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 排序算法:直接插入排序算法实现及分析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

直接插入排序算法介紹

還是先過(guò)一遍定義。直接插入排序(Straight Insertion Sort)的基本操作是將一個(gè)記錄插入到已經(jīng)排好序的有序表中,從而得到一個(gè)新的、記錄數(shù)增1的有序表。來(lái)我們用通俗一點(diǎn)的話說(shuō),就是把數(shù)組中元素一個(gè)個(gè)取出插入到有序表中,直到將數(shù)組元素全部插入到有序表中。那么如何構(gòu)造有序表呢?我們不需要構(gòu)造,有序表 只是一種形式。當(dāng)有序表中只有一個(gè)元素時(shí),那它肯定是有序的呀。所以我們開(kāi)始將第0個(gè)元素當(dāng)做有序表

我們先假定升序。int temp = arr[1]與有序表的最大值arr[0]進(jìn)行比較,arr[1]<arr[0]那么arr[0]就往后挪,挪到arr[1]的位置,此時(shí)temp 和 有序表中的第二個(gè)最值進(jìn)行比較,發(fā)現(xiàn)和有序表比較完了,temp 就放到arr[0]處唄。

現(xiàn)在我們假定有序表中已經(jīng)有多個(gè)元素了。我們?nèi)〉綌?shù)組中的第i個(gè)數(shù)組元素,往 0~ i-1 的有序表中進(jìn)行插入,它的比較過(guò)程如下跟有序表的最大值arr[i-1]比較,發(fā)現(xiàn)比最大值小,將最值arr[i-1]往前挪,繼續(xù)和有序表中第二大的值arr[i-2],進(jìn)行比較,如果還是發(fā)現(xiàn)比它小,這有序表中的第二大的值arr[i-2]繼續(xù)往前挪,繼續(xù)進(jìn)行比較直到找到有序表中第j個(gè)元素比當(dāng)前元素要小或者將有序表找完了。將當(dāng)前元素放到j+1的位置,這樣就找到了第i元素要插入的位置了。

直接插入排序算法代碼

//直接插入排序 升序 void InsertSort_Up(int* arr, int length) {//假定第0個(gè)元素是有序表,從第1個(gè)元素開(kāi)始往有序表中插入數(shù)據(jù)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; }

直接插入排序算法時(shí)間復(fù)雜度分析

我們考慮最壞的情況,當(dāng)數(shù)組完全逆序的時(shí)候比如{6,5,4,3,2,1}這種情況,我們進(jìn)行升序排序,我們比較的次數(shù):1+2+3+4+5,數(shù)據(jù)移動(dòng)的次數(shù):1+2+3+4+5。擴(kuò)展到n個(gè)元素的數(shù)組 比較次數(shù):1+2...+n-1 = n*(n-1)/2,移動(dòng)的次數(shù)同樣為n*(n-1)/2,所考慮數(shù)據(jù)隨機(jī)的情況,時(shí)間復(fù)雜度為(n^2 -n)/2 = O(n^2)從這里可以看出同樣的O(n^2)時(shí)間復(fù)雜度,直接插入排序比選擇排序和冒泡排序性能要要一些直接插入排序?qū)?span style="color:#ff0000;">數(shù)組基本有序和數(shù)組元素比較少的時(shí)候,速度比較快

完整代碼

#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個(gè)元素是有序表,從第1個(gè)元素開(kāi)始往有序表中插入數(shù)據(jù)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個(gè)元素是有序表,從第1個(gè)元素開(kāi)始往有序表中插入數(shù)據(jù)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; } //打印數(shù)組元素 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));//設(shè)置隨機(jī)種子int arr[MAXSIZE] = { 0 };//給每個(gè)元素設(shè)置一個(gè)隨機(jī)值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; }

運(yùn)行結(jié)果檢測(cè)


總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。