網站首頁 編程語言 正文
排序算法之希爾排序
基本思想
將相距某個“增量”的記錄組成一個子序列,這樣才能保證在子序列內分別進行直接插入排序后得到的結果是基本有序的而不是局部有序。
進一步理解:
先將整個待排元素序列分割成若干個子序列(由相隔某個“增量”的元素組成的)分別進行直接插入排序,然后依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。
希爾排序算法
#include <iostream>
using namespace std;?
void shellSort(int arr[], int n)
{
?? ?int tmp = 0;
?? ?int step = n / 2;
?? ?while (step)
?? ?{
?? ??? ?for (int i = step; i < n; i++)
?? ??? ?{
?? ??? ??? ?tmp = arr[i];
?? ??? ??? ?int j = i;
?? ??? ??? ?while (j >= step && tmp < arr[j - step]) ? //采用直接插入排序
?? ??? ??? ?{
?? ??? ??? ??? ?arr[j] = arr[j - step];
?? ??? ??? ??? ?j -= step;
?? ??? ??? ?}
?
?? ??? ??? ?arr[j] = tmp;
?? ??? ?}
?
?? ??? ?step = step / 2;
?? ?}
}
?
int main()
{
?? ?int arr[]{ 3, 14, 25, -22, -3, 87, 126, 34, 64, -70, 15, 17, 78 };
?? ?int n = sizeof(arr) / sizeof(arr[0]);
?? ?shellSort(arr, n);
?? ?for (int i = 0; i < n; i++)
?? ??? ?cout << arr[i] << " ";
?
?? ?system("pause");
? ? return 0;
}
復雜度分析
當增量為1(step = 1)時,希爾排序退化成了直接插入排序,此時的時間復雜度為O(N2);
Hibbard增量的希爾排序的時間復雜度O(n^3/2);
關于希爾排序的問題分析
排序算法之希爾排序及時間復雜度分析
希爾排序
算法思想:將整個待排序列分割成若干個子序列(由相隔增量個元素組成),分別進行直接插入排序,然后依次縮小增量再進行排序,待整個序列中的元素基本有序時,再對全體元素進行一次直接插入排序。
希爾排序的實現應該由三個循環完成
(1)第一次循環,將增量d依次折半,直到增量d=1
(2)第二三層循環,也就是直接插入排序所需要的兩次循環。
算法實現:
#include <stdio.h>
#define N 9
int main(void)
{
int arr[N] = {9,1,5,8,3,7,4,6,2};
int d = N / 2; //增量先取一半
int i,j,insertVal;
//希爾排序三層循環
while(d>=1) //當增量大于等于1,不斷進行插入排序
{
//一下兩層for循環是直接插入排序代碼
for(i=d; i<N; i++)
{
insertVal = arr[i];
j = i - d;
while(j>=0 && arr[j]>insertVal)
{
arr[j+d] = arr[j];
j = j - d;
}
arr[j+d] = insertVal;
}
d = d / 2;
}
for(i=0; i<N; i++)
{
printf("%d ",arr[i]);
}
return 0;
}
由如上代碼知,希爾排序的關鍵并不是隨便分組后各自排序,而是將相隔某個增量的記錄組成一個子序列,實現跳躍式移動,使得排序的效率高。
時間復雜度
時間復雜度為O(n^1.5),要好于直接排序的O(n ^ 2),需要注意的是增量序列的最后一個增量值必須是1.另外由于記錄跳躍式的移動,希爾排序并不是一種穩定的排序方法。
原文鏈接:https://blog.csdn.net/www_dong/article/details/110727189
相關推薦
- 2022-10-15 淺談React?useDebounce?防抖原理_React
- 2022-09-15 Python利用shutil實現拷貝文件功能_python
- 2022-08-18 C++詳解如何實現單鏈表_C 語言
- 2022-10-17 .Net?Core使用Coravel實現任務調度的完整步驟_實用技巧
- 2022-04-11 利用Python操作excel表格的完美指南_python
- 2023-04-06 關于yolov8訓練的一些改動及注意事項_python
- 2022-10-13 C#?Chart控件標記問題詳解_C#教程
- 2022-09-25 Linux中安裝和配置Redis
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支