亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

c++實現(xiàn)排序算法之希爾排序方式

 更新時間:2022年07月20日 10:56:59   作者:卻道天涼_好個秋  
這篇文章主要介紹了c++實現(xiàn)排序算法之希爾排序方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

排序算法之希爾排序

基本思想

將相距某個“增量”的記錄組成一個子序列,這樣才能保證在子序列內分別進行直接插入排序后得到的結果是基本有序的而不是局部有序。

進一步理解:

先將整個待排元素序列分割成若干個子序列(由相隔某個“增量”的元素組成的)分別進行直接插入排序,然后依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。

希爾排序算法

#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(N²);

Hibbard增量的希爾排序的時間復雜度O(n^3/2);

關于希爾排序的問題分析

排序算法之希爾排序及時間復雜度分析

希爾排序

算法思想:將整個待排序列分割成若干個子序列(由相隔增量個元素組成),分別進行直接插入排序,然后依次縮小增量再進行排序,待整個序列中的元素基本有序時,再對全體元素進行一次直接插入排序。

希爾排序的實現(xiàn)應該由三個循環(huán)完成

(1)第一次循環(huán),將增量d依次折半,直到增量d=1

(2)第二三層循環(huán),也就是直接插入排序所需要的兩次循環(huán)。

算法實現(xiàn):

#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;
	//希爾排序三層循環(huán)
	while(d>=1) //當增量大于等于1,不斷進行插入排序
	{
		//一下兩層for循環(huán)是直接插入排序代碼
		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;
}

由如上代碼知,希爾排序的關鍵并不是隨便分組后各自排序,而是將相隔某個增量的記錄組成一個子序列,實現(xiàn)跳躍式移動,使得排序的效率高。

時間復雜度

時間復雜度為O(n^1.5),要好于直接排序的O(n ^ 2),需要注意的是增量序列的最后一個增量值必須是1.另外由于記錄跳躍式的移動,希爾排序并不是一種穩(wěn)定的排序方法。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • C語言實現(xiàn)電話簿項目

    C語言實現(xiàn)電話簿項目

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)電話簿項目,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C語言strlen和sizeof在數(shù)組中的使用詳解

    C語言strlen和sizeof在數(shù)組中的使用詳解

    對于 strlen 和 sizeof,相信不少程序員會混淆其功能。雖然從表面上看它們都可以求字符串的長度,但二者卻存在著許多不同之處及本質區(qū)別
    2021-10-10
  • C++內嵌匯編示例詳解

    C++內嵌匯編示例詳解

    這篇文章主要介紹了C++內嵌匯編,本文的所有代碼是在我自己的VS2008中測試的,由于環(huán)境的差別,不能保證能在所有的編譯器上運行,需要的朋友可以參考下
    2022-01-01
  • C語言近萬字為你講透樹與二叉樹

    C語言近萬字為你講透樹與二叉樹

    樹是計算機算法最重要的非線性結構。因為樹能很好地描述結構的分支關系和層次特性,所以在計算機科學和計算機應用領域有著廣泛的應用。這篇文章我就帶大家一起了解一下樹、二叉樹這種結構,下篇文章會重點向大家介紹二叉樹的遍歷算法
    2022-05-05
  • C#中?MessageBox的使用技巧

    C#中?MessageBox的使用技巧

    這篇文章主要介紹了C#中?MessageBox的使用技巧,在C#中MessageBox消息對話框位于System.Windows.Forms命名空間中,更多詳細的內容需要的朋友可以參考一下
    2022-08-08
  • 基于C語言編寫一個簡單的Web服務器

    基于C語言編寫一個簡單的Web服務器

    C語言可以干大事,這篇文章主要為大家詳細介紹了如何基于C語言可以完成一個簡易的Web服務器,希望這篇文章會幫你你對C語言有更深入的理解
    2024-03-03
  • C++實現(xiàn)字符格式相互轉換的示例代碼

    C++實現(xiàn)字符格式相互轉換的示例代碼

    這篇文章主要為大家詳細介紹了C++中實現(xiàn)字符格式相互轉換的方法,主要有UTF8與string互轉、wstring與string互轉,感興趣的小伙伴可以了解一下
    2022-11-11
  • 詳談C++何時需要定義賦值/復制構造函數(shù)

    詳談C++何時需要定義賦值/復制構造函數(shù)

    下面小編就為大家?guī)硪黄斦凜++何時需要定義賦值/復制構造函數(shù)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • C語言深度解剖篇之關鍵字以及補充內容

    C語言深度解剖篇之關鍵字以及補充內容

    C語言的關鍵字共有32個,根據(jù)關鍵字的作用,可分其為數(shù)據(jù)類型關鍵字、控制語句關鍵字、存儲類型關鍵字和其它關鍵字四類,這篇文章主要給大家介紹了關于C語言深度解剖篇之關鍵字以及補充內容的相關資料,需要的朋友可以參考下
    2022-06-06
  • C++11實現(xiàn)字符串分割的示例

    C++11實現(xiàn)字符串分割的示例

    本文主要介紹了C++11實現(xiàn)字符串分割的示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評論