網站首頁 編程語言 正文
1. 直接插入排序介紹
1.1 定義
直接插入排序是一種最簡單的排序方法,其基本操作是將一條記錄插入到已排好的有序表中,從而得到一個新的、記錄數(shù)量增1的有序表。
1.2 基本原理
每次從無序表中取出第一個元素,把它插入到有序表的合適位置,使有序表仍然有序。
第一趟比較前兩個數(shù),然后把第二個數(shù)按大小插入到有序表中; 第二趟把第三個數(shù)據(jù)與前兩個數(shù)從后向前掃描,把第三個數(shù)按大小插入到有序表中;依次進行下去,進行了(n-1)趟掃描以后就完成了整個排序過程。
下面的動圖非常清晰的詮釋了直接插入排序的過程:
1.3 時間復雜度
時間復雜度
最好的情況是數(shù)組所有元素已經是有序排列,在排序時待排元素只需與前一元素比較,不用繼續(xù)往前搜索比較,時間復雜度為O(n);
最差的情況是數(shù)組所有元素全部反序,在排序時待排元素需要與前面所有有序元素進行比較,比較次數(shù)為:
1+2+…+(n-1) = n(n-1)/2
每次前面的有序元素均要往后移動,移動次數(shù)為:
(1+2)+(2+2)+…+(n-1+2) =(n-1)(n+4)/2
綜上所述,直接插入排序的平均時間復雜度為O( n 2 n^2 n2) 。
1.4 空間復雜度
直接插入排序為平行移動,因此空間復雜度為:O(1) 。
1.5 優(yōu)缺點
優(yōu)點:直接插入排序算法簡單,當待排序記錄數(shù)量n很小時,局部有序時,較為適用。
缺點:當數(shù)據(jù)量龐大并且亂序嚴重時,比較和移動次數(shù)多,排序效率低。
2. 代碼實現(xiàn)
2.1 代碼設計
a. 實現(xiàn)直接插入排序需要設計兩層循環(huán),整個數(shù)組為外循環(huán),已經排列好的有序元素為內循環(huán);
b. 從外循環(huán)取出待排元素array[i],使用臨時變量temp存儲其值;
c. 將待排元素與內循環(huán)的有序元素依次(從后往前)進行比較,若有序元素比待排元素大,則向后移動一位;
d. 直至有序元素比待排元素小,則不再移動,將temp賦值給array[j+1]。
2.2 代碼實現(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;
}
運行結果:
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
原文鏈接:https://blog.csdn.net/NoBack7/article/details/126131476
相關推薦
- 2022-09-08 Python數(shù)據(jù)分析基礎之異常值檢測和處理方式_python
- 2023-01-10 SpringEvent優(yōu)雅解耦時連續(xù)兩個bug的解決方案_Golang
- 2022-07-13 CMD使用技巧和常用固定語句
- 2022-07-31 Python常見的幾種數(shù)據(jù)加密方式_python
- 2022-05-19 使用python求解迷宮問題的三種實現(xiàn)方法_python
- 2022-06-27 Abp集成HangFire開源.NET任務調度框架_實用技巧
- 2022-11-11 python?使用第三方庫requests-toolbelt?上傳文件流的示例_python
- 2022-12-24 Python中切片操作的示例詳解_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支