欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

插入排序算法之希爾排序+直接插入排序

 更新時間:2021年11月17日 10:30:32   作者:凜音Rinne  
這篇文章主要介紹了插入排序算法之希爾排序+直接插入排序的相關(guān)知識,本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

希爾排序

在介紹希爾排序之前,先了解一下直接插入排序

一、直接插入排序

1. 單趟排序

x插入一個有序區(qū)間

在這里插入圖片描述

這里end是指向數(shù)組最后一個元素

在這里插入圖片描述

2. 直接插入排序

根據(jù)上面的單趟排序啟發(fā)

end是數(shù)組的最后一個元素,end之后的元素都是待排序

在這里插入圖片描述

一個關(guān)鍵的判斷點(diǎn),end和x比較大小

這里end < x

還需要再做改善

在這里插入圖片描述

可以發(fā)現(xiàn)有兩個循環(huán),一個循環(huán)時end倒著遍歷完之后,使得最開始的end結(jié)束的數(shù)組加入x后是一個有序數(shù)組,最后再返回這個新數(shù)組的最后一個元素所在位置

注意公共部分

end--;
x = a[end + 1];

外面是一個for循環(huán),從第二個到最后一個元素

for(i = 0; i < n - 1; i++)
{
    
}

代碼:

//插入排序
void InsetSort(int* a, int n)
{
	int end = 0;
	int i = 0;

	for (i = 0; i < n - 1; i++)
	{
		end = i;
		int x = a[end + 1];

		while (end >= 0)
		{
			if (a[end] > x)
			{
				a[end + 1] = a[end];
				a[end] = x;
				
			}
			else
			{
				break;
			}
			end--;
		}
	}
	
}

時間復(fù)雜度O(N2)

測試:

int main()
{
	int a[4] = { 2, 6, 5, 3 };
	InsetSort(a, 4);
	//ShellSort(a, 4);

	int i = 0;
	for (i = 0; i < 4; i++)
	{
		printf("%d ", a[i]);

	}
	printf("\n");

	return 0;
}

在這里插入圖片描述

二、希爾排序

希爾排序法又稱縮小增量法

希爾排序法的基本思想是:先選定一個整數(shù),把待排序文件中所有記錄分成gap個組,所有距離為的記錄分在同一組內(nèi),并對每一組內(nèi)的記錄進(jìn)行排序。然后,重復(fù)上述分組和排序的工作。當(dāng)?shù)竭_(dá)gap=1時,所有記錄在統(tǒng)一組內(nèi)排好序。

希爾排序是根據(jù)直接插入排序的基礎(chǔ)上,先進(jìn)行分組排序

在這里插入圖片描述

3個為一組進(jìn)行排序

在這里插入圖片描述

時間復(fù)雜度:

每次排可以看作長度為gap的數(shù)組直接插入排序

一共有gap組,當(dāng)然并不是每組都是gap/n個元素,但當(dāng)數(shù)據(jù)相當(dāng)多的時候我們看作每個數(shù)組都有gap/n個元素

所以是 (1+2……+n/gap)gap

如果gap = 1,則時間復(fù)雜度是O(n2),相當(dāng)于直接插入排序

//希爾排序
void ShellSort(int* a, int n)
{
	int end = 0;
	int i = 0;
	int j = 0;
	int gap = 6;

	//預(yù)排序
	for (j = 0; j < gap; j++)
	{
		//最后一個數(shù)一定是1
		gap = gap / 2;
		for (i = 0; i < n - gap; i++)
		{
			end = i;
            //這里其實(shí)就是直接插入排序,而數(shù)組的每個元素間隔是gap
			int x = a[end + gap];

			while (end >= 0)
			{
				if (a[end] > x)
				{
					a[end + gap] = a[end];
					a[end] = x;

				}
				else
				{
					break;
				}
				end -= gap;
			}
		}

	}
}

測試用例還是上面直接插入排序的例子

結(jié)果還是成功的

在這里插入圖片描述

三、測試希爾排序和直接插入排序性能

//性能測試
void TestOP()
{
	srand(time(0));
    //以1000個數(shù)字為例
	const int N = 10000;
	int* a1 = (int*)malloc(sizeof(int) * N);
	int* a2 = (int*)malloc(sizeof(int) * N);

	for (int i = 0; i < N; ++i)
	{
		a1[i] = rand();
		a2[i] = a1[i];
	}
    //這里clock是運(yùn)行到這里的時間
	int begin1 = clock();
	InsertSort(a1, N);
	int end1 = clock();

	int begin2 = clock();
	ShellSort(a2, N);
	int end2 = clock();
    //end-begin為排序所用時間
	printf("%d\n%d\n", end1 - begin1, end2 - begin2);
}

在這里插入圖片描述

可以看出希爾排序比直接排序快得多,但希爾排序因?yàn)間ap可以改變,目前沒有一個統(tǒng)一的時間復(fù)雜度,先按照時間復(fù)雜度為O(n1.3)來吧

到此這篇關(guān)于插入排序算法之希爾排序+直接插入排序的文章就介紹到這了,更多相關(guān)插入排序算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++利用opencv實(shí)現(xiàn)單目測距的實(shí)現(xiàn)示例

    C++利用opencv實(shí)現(xiàn)單目測距的實(shí)現(xiàn)示例

    本文主要介紹了C++利用opencv實(shí)現(xiàn)單目測距的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 詳解C++?的STL迭代器原理和實(shí)現(xiàn)

    詳解C++?的STL迭代器原理和實(shí)現(xiàn)

    這篇文章主要為大家介紹了C++的STL迭代器原理和實(shí)現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C++阻止類被實(shí)例化詳解

    C++阻止類被實(shí)例化詳解

    下面小編就為大家?guī)硪黄獪\談C++阻止類被實(shí)例化詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-09-09
  • C語言 strftime 格式化顯示日期時間的實(shí)現(xiàn)

    C語言 strftime 格式化顯示日期時間的實(shí)現(xiàn)

    下面小編就為大家?guī)硪黄狢語言 strftime 格式化顯示日期時間的實(shí)現(xiàn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • C++連接并使用MySQL數(shù)據(jù)庫

    C++連接并使用MySQL數(shù)據(jù)庫

    這篇文章主要為大家詳細(xì)介紹了C++連接并使用MySQL數(shù)據(jù)庫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • c++下使用windows api遍歷指定文件夾及其子文件夾中的文件

    c++下使用windows api遍歷指定文件夾及其子文件夾中的文件

    這篇文章主要介紹了c++下使用windows api遍歷指定文件夾及其子文件夾中的文件實(shí)現(xiàn)代碼,一般都是通過c++自帶的函數(shù)實(shí)現(xiàn)
    2021-07-07
  • C++ Vector用法詳解

    C++ Vector用法詳解

    這篇文章主要介紹了C++ Vector用法詳解,vector是C++標(biāo)準(zhǔn)模版庫(STL,Standard Template Library)中的部分內(nèi)容,本文詳細(xì)介紹了它的方方面面,需要的朋友可以參考下
    2015-07-07
  • C語言實(shí)現(xiàn)賓館管理系統(tǒng)課程設(shè)計(jì)

    C語言實(shí)現(xiàn)賓館管理系統(tǒng)課程設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)賓館管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言數(shù)據(jù)結(jié)構(gòu)之單鏈表存儲詳解

    C語言數(shù)據(jù)結(jié)構(gòu)之單鏈表存儲詳解

    鏈表是一種物理存儲結(jié)構(gòu)上非連續(xù)、非順序的存儲結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的。本文將和大家一起聊聊C語言中單鏈表的存儲,感興趣的可以學(xué)習(xí)一下
    2022-07-07
  • C語言數(shù)組實(shí)現(xiàn)三子棋應(yīng)用實(shí)例

    C語言數(shù)組實(shí)現(xiàn)三子棋應(yīng)用實(shí)例

    這篇文章主要為大家詳細(xì)介紹了C語言數(shù)組實(shí)現(xiàn)三子棋應(yīng)用實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評論