C語言直接插入排序算法介紹及示例
1. 直接插入排序介紹
1.1 定義
直接插入排序是一種最簡(jiǎn)單的排序方法,其基本操作是將一條記錄插入到已排好的有序表中,從而得到一個(gè)新的、記錄數(shù)量增1的有序表。
1.2 基本原理
每次從無序表中取出第一個(gè)元素,把它插入到有序表的合適位置,使有序表仍然有序。
第一趟比較前兩個(gè)數(shù),然后把第二個(gè)數(shù)按大小插入到有序表中; 第二趟把第三個(gè)數(shù)據(jù)與前兩個(gè)數(shù)從后向前掃描,把第三個(gè)數(shù)按大小插入到有序表中;依次進(jìn)行下去,進(jìn)行了(n-1)趟掃描以后就完成了整個(gè)排序過程。
下面的動(dòng)圖非常清晰的詮釋了直接插入排序的過程:

1.3 時(shí)間復(fù)雜度
時(shí)間復(fù)雜度
最好的情況是數(shù)組所有元素已經(jīng)是有序排列,在排序時(shí)待排元素只需與前一元素比較,不用繼續(xù)往前搜索比較,時(shí)間復(fù)雜度為O(n);
最差的情況是數(shù)組所有元素全部反序,在排序時(shí)待排元素需要與前面所有有序元素進(jìn)行比較,比較次數(shù)為:
1+2+…+(n-1) = n(n-1)/2
每次前面的有序元素均要往后移動(dòng),移動(dòng)次數(shù)為:
(1+2)+(2+2)+…+(n-1+2) =(n-1)(n+4)/2
綜上所述,直接插入排序的平均時(shí)間復(fù)雜度為O( n 2 n^2 n2) 。
1.4 空間復(fù)雜度
直接插入排序?yàn)槠叫幸苿?dòng),因此空間復(fù)雜度為:O(1) 。
1.5 優(yōu)缺點(diǎn)
優(yōu)點(diǎn):直接插入排序算法簡(jiǎn)單,當(dāng)待排序記錄數(shù)量n很小時(shí),局部有序時(shí),較為適用。
缺點(diǎn):當(dāng)數(shù)據(jù)量龐大并且亂序嚴(yán)重時(shí),比較和移動(dòng)次數(shù)多,排序效率低。
2. 代碼實(shí)現(xiàn)
2.1 代碼設(shè)計(jì)
a. 實(shí)現(xiàn)直接插入排序需要設(shè)計(jì)兩層循環(huán),整個(gè)數(shù)組為外循環(huán),已經(jīng)排列好的有序元素為內(nèi)循環(huán);
b. 從外循環(huán)取出待排元素array[i],使用臨時(shí)變量temp存儲(chǔ)其值;
c. 將待排元素與內(nèi)循環(huán)的有序元素依次(從后往前)進(jìn)行比較,若有序元素比待排元素大,則向后移動(dòng)一位;
d. 直至有序元素比待排元素小,則不再移動(dòng),將temp賦值給array[j+1]。
2.2 代碼實(shí)現(xiàn)
#include <stdio.h>
void printArray(int array[], int size) {
int i;
for (i = 0; i < size; i++) {
printf("%d ", array[i]);
}
printf("\n");
}
void insertSort(int array[], int size) {
int temp,i,j;
for (i = 1; i < size; i++) {
temp = array[i];
j = i-1;
while (j >= 0 && array[j] > temp) {
array[j+1] = array[j];
j--;
}
array[j+1] = temp;
printArray(array, size);
}
}
int main() {
int array[] = {3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
printArray(array, sizeof(array)/sizeof(int));
insertSort(array, sizeof(array)/sizeof(int));
return 0;
}運(yùn)行結(jié)果:
3 44 38 5 47 15 36 26 27 2 46 4 19 50 48
3 44 38 5 47 15 36 26 27 2 46 4 19 50 48
3 38 44 5 47 15 36 26 27 2 46 4 19 50 48
3 5 38 44 47 15 36 26 27 2 46 4 19 50 48
3 5 38 44 47 15 36 26 27 2 46 4 19 50 48
3 5 15 38 44 47 36 26 27 2 46 4 19 50 48
3 5 15 36 38 44 47 26 27 2 46 4 19 50 48
3 5 15 26 36 38 44 47 27 2 46 4 19 50 48
3 5 15 26 27 36 38 44 47 2 46 4 19 50 48
2 3 5 15 26 27 36 38 44 47 46 4 19 50 48
2 3 5 15 26 27 36 38 44 46 47 4 19 50 48
2 3 4 5 15 26 27 36 38 44 46 47 19 50 48
2 3 4 5 15 19 26 27 36 38 44 46 47 50 48
2 3 4 5 15 19 26 27 36 38 44 46 47 50 48
2 3 4 5 15 19 26 27 36 38 44 46 47 48 50
到此這篇關(guān)于C語言直接插入排序算法介紹及示例的文章就介紹到這了,更多相關(guān)C語言直接插入排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c語言中十六進(jìn)制轉(zhuǎn)二進(jìn)制顯示的實(shí)現(xiàn)方法
本篇文章對(duì)c語言中十六進(jìn)制轉(zhuǎn)二進(jìn)制顯示的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
c++中#include <>與#include""的區(qū)別詳細(xì)解析
<>先去系統(tǒng)目錄中找頭文件,如果沒有在到當(dāng)前目錄下找。所以像標(biāo)準(zhǔn)的頭文件 stdio.h、stdlib.h等用這個(gè)方法2013-10-10
C語言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(多文件)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12
10個(gè)步驟Opencv輕松檢測(cè)出圖片中條形碼
這篇文章主要為大家詳細(xì)介紹了Opencv輕松檢測(cè)出圖片中條形碼的10個(gè)步驟,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
C++中關(guān)鍵字const的詳細(xì)說明和使用介紹(最全)
const在C/C++中是十分重要的,如果單純理解為“常量”那么你的格局就小了,今天在這里給大家介紹一下const在C++中具體詳細(xì)的用法,需要的朋友可以參考下2025-03-03

