網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
一.直接插入排序
1.1直接插入排序引入
排序是我們生活中經(jīng)常會(huì)面對(duì)的問(wèn)題,以打撲克牌為例,你摸的手牌肯定是雜亂的,你一定會(huì)將小牌移動(dòng)到大牌的左面,大牌移動(dòng)到小牌的右面,這樣順序就算理好了。這里我們的理牌方法就是直接插入排序。
1.2直接插入排序的核心思想與算法分析
核心思想: 就是將一個(gè)記錄插入到已經(jīng)排好序的有序表中,從而得到一個(gè)新的記錄數(shù)增1的有序表。
算法分析:
- 從序列第一個(gè)元素開(kāi)始,該元素可以認(rèn)為已經(jīng)被排序
- 取出下一個(gè)元素,設(shè)為待插入元素,在已經(jīng)排序的元素序列中從后向前掃描,如果該元素(已排序)大于待插入元素,將該元素移到下一位置。
- 重復(fù)步驟2,直到找到已排序的元素小于或者等于待排序元素的位置,插入元素。
- 重復(fù)2,3步驟,完成排序。
1.3實(shí)例說(shuō)明
以12,2,9,8,18,7這幾個(gè)數(shù)字為例,排序過(guò)程:
- 這里三角形表示要插入的值
- 橫線表示已經(jīng)排好序的數(shù)字
- j是趟數(shù),是這一趟開(kāi)始的時(shí)候已排序隊(duì)列的最后一個(gè)值的下標(biāo)。
1.4直接插入排序代碼實(shí)現(xiàn)
代碼如下:
void InsertSort(int* arr, int len)
{
//assert arr!=NULL
for (int i = 1; i < len; i++)//一共跑了多少趟 //01234 12345
{
int tmp = arr[i];//待插入的值
//j 指向 這一趟開(kāi)始的時(shí)候的已排序好的隊(duì)列中最后一個(gè)值的下標(biāo)
int j;
for (j = i - 1; j >= 0; j--)//這里控制待插入的值和 已排序隊(duì)列的挨著比較(從右向左比較)
{
if (arr[j] <= tmp)
{
break;//這時(shí)應(yīng)該停下來(lái)
}
else
{
arr[j + 1] = arr[j];
}
}
arr[j + 1] = tmp;
}
}
1.5直接插入排序性能分析
時(shí)間復(fù)雜度:
(1)順序排序時(shí),只需比較(n-1)次,插入排序時(shí)間復(fù)雜度為O(n);
(2)逆序排序時(shí),需比較n(n-1)/2次,插入排序時(shí)間復(fù)雜度為O(n^2);
(3)當(dāng)原始序列雜亂無(wú)序時(shí),平均時(shí)間復(fù)雜度為O(n^2)。
空間復(fù)雜度:
插入排序過(guò)程中,需要一個(gè)臨時(shí)變量temp存儲(chǔ)待排序元素,因此空間復(fù)雜度為O(1)。
算法穩(wěn)定性:
插入排序是一種穩(wěn)定的排序算法。
二.希爾排序
2.1希爾排序引入
希爾排序其實(shí)就是對(duì)直接插入排序的優(yōu)化,在第一部分我們說(shuō)過(guò)==(1)直接插入排序數(shù)據(jù)越有序,插入的效率就越高;(2)記錄數(shù)比較少時(shí),直接插入的優(yōu)勢(shì)也很明顯。==希爾排序就是根據(jù)這兩個(gè)特點(diǎn)進(jìn)行的優(yōu)化。
2.2希爾排序的核心思想與算法分析
核心思想: 通過(guò)一個(gè)不斷縮小的增量序列,對(duì)無(wú)序序列反復(fù)的進(jìn)行拆分并且對(duì)拆分后的序列使用插入排序的。
算法分析:
- 先將整個(gè)待排元素序列分割成若干個(gè)子序列(由相隔某個(gè)“增量”的元素組成的);
- 分別進(jìn)行直接插入排序,然后依次縮減增量再進(jìn)行排序;
- 待整個(gè)序列中的元素基本有序(增量足夠小)時(shí),再對(duì)全體元素進(jìn)行一次直接插入排序;
- 完成排序。
2.3實(shí)例說(shuō)明
以12,2,9,8,5,88,99,10,7,17,77,66,89,10,21為例,排序過(guò)程如下:
- 這里相同顏色的線相同的分組
- 每次增量取上一次的一半(向下取整)
- 注意:最后一個(gè)增量值必須等于1才可以
2.4希爾排序代碼實(shí)現(xiàn)
代碼如下:
void Shell(int arr[], int len, int gap)//一趟希爾排序
{
for (int i = gap; i < len; i++)//i++ 不是i=i+gap;
{
int tmp = arr[i];//待插入的值
//j 指向 這一趟開(kāi)始的時(shí)候的已排序好的隊(duì)列中最后一個(gè)值的下標(biāo)
int j;
for (j = i - gap; j >= 0; j = j - gap)//這里控制待插入的值和 已排序隊(duì)列的挨著比較(從右向左比較)
{
if (arr[j] <= tmp)
{
break;//這時(shí)應(yīng)該停下來(lái)
}
else
{
arr[j + gap] = arr[j];
}
}
arr[j + gap] = tmp;
}
}
void ShellSort(int arr[], int len)
{
int gap[] = { 5, 3, 1 };//
int gap_len = sizeof(gap) / sizeof(gap[0]);
for (int i = 0; i < gap_len; i++)
{
Shell(arr, len, gap[i]);
}
}
2.5希爾排序性能分析
時(shí)間復(fù)雜度:
希爾排序的時(shí)間復(fù)雜度依賴(lài)于增量序列的函數(shù),當(dāng)n在某個(gè)特定的范圍后最優(yōu)的情況下,希爾排序的時(shí)間復(fù)雜度為O(n ^ 1.3),在最差的情況下,希爾排序的時(shí)間復(fù)雜度為:O(n ^ 2)。
空間復(fù)雜度:
希爾排序的空間復(fù)雜度:O(1)。
算法穩(wěn)定性:
希爾排序并不是一種穩(wěn)定的排序算法。
原文鏈接:https://blog.csdn.net/weixin_56935264/article/details/123797530
相關(guān)推薦
- 2022-06-22 Android中TextView動(dòng)態(tài)設(shè)置縮進(jìn)距離的方法_Android
- 2023-12-20 IDEA新建maven項(xiàng)目,使用mybatis操作數(shù)據(jù)庫(kù)完整過(guò)程
- 2022-11-05 Android實(shí)現(xiàn)雙曲線折線圖_Android
- 2023-03-23 Android視圖綁定viewBinding的使用介紹_Android
- 2022-06-21 c語(yǔ)言詳解動(dòng)態(tài)內(nèi)存分配及常見(jiàn)錯(cuò)誤的解決_C 語(yǔ)言
- 2022-06-25 EF?Core的CRUD(增刪改查)基本操作_實(shí)用技巧
- 2022-08-13 Linux內(nèi)核中container_of宏定義講解
- 2022-09-04 Golang?實(shí)現(xiàn)?RTP音視頻傳輸示例詳解_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支