最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言常見排序算法歸并排序

 更新時(shí)間:2022年07月14日 09:04:27   作者:保護(hù)小周?  
這篇文章主要介紹了C語言常見排序算法歸并排序,歸并排序是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法的一個(gè)非常典型的應(yīng)用

前言

本期為大家?guī)淼氖浅R娕判蛩惴ㄖ械?strong>歸并排序,博主在這里先分享歸并排序的遞歸算法,包您一看就會(huì),快來試試吧~

 一、歸并排序

1.1 基本思想

歸并排序(MERGE-SORT)是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法 (Divide and Conquer)的一個(gè)非常典型的應(yīng)用。將已有序的子序列合并,得到完全有序的序 列;即先使每個(gè)子序列有序,再使子序列段間有序。若將兩個(gè)有序表合并成一個(gè)有序表,稱為二路歸并。

1.2 算法思想

到這里,我們可以得到一條結(jié)論,兩個(gè)有序的子序列可以合成一個(gè)新的有序子序列,通過遞歸,我們兩個(gè)新的有序序列也可以組成新的有序數(shù)列,最終實(shí)現(xiàn)排序的目的。有些朋友就會(huì)問了,這個(gè)我懂,關(guān)鍵是咋實(shí)現(xiàn)有序數(shù)列,其實(shí)非常的簡(jiǎn)單,分割遞歸至每個(gè)子序列只有一個(gè)元素時(shí),是不是就有序啦,然后就可以合成有兩個(gè)元素有序的列表嘛,再合成4個(gè),8個(gè)……

1.3 程序設(shè)計(jì)思想

定義一個(gè)tmp數(shù)組,可以是動(dòng)態(tài)開辟的(malloc),用于臨時(shí)存放合并后的有序數(shù)據(jù),定義_MergeSort()函數(shù),用于分解,合并數(shù)據(jù)(遞歸實(shí)現(xiàn)),參數(shù)有,待處理數(shù)組,數(shù)據(jù)區(qū)間(數(shù)組下標(biāo)),tmp數(shù)組。

  • 判斷區(qū)間是否存在,區(qū)間不存在以及只有一個(gè)元素的情況結(jié)束程序。
  • 分割區(qū)間:mid=(left+right)/2;遞歸左右區(qū)間,分割遞歸至每個(gè)子序列只有一個(gè)元素。
  • 每?jī)蓚€(gè)子序列一組,循環(huán)遍歷每一個(gè)元素,if比較兩個(gè)子序列各元素的大小,取大或取小,放入tmp數(shù)組,tmp[index++]=子序列++;直到有一個(gè)子序列遍歷完,循環(huán)結(jié)束。
  • 循環(huán)判斷是子序列是否遍歷完畢,未遍歷完畢的子序列剩余元素直接給到tmp數(shù)組。將tmp數(shù)組的對(duì)應(yīng)的元素拷貝回原數(shù)組(已有序)。

1.4 程序?qū)崿F(xiàn)

#define _CRT_SECURE_NO_WARNINGS
 
#include<stdio.h>
#include<stdlib.h>//動(dòng)態(tài)開辟空間的函數(shù)的頭文件
 
void _MergeSort(int *a,int left,int right,int *tmp)
{
	//區(qū)間不存在以及只有一個(gè)元素的情況結(jié)束程序
	if (left>=right)
	{
		return;
	}
 
	int mid = (left + right) / 2;
	//假設(shè)[left,mid],[mid+1,right]有序,那么我們就可以歸并了
	//遞歸使左右區(qū)間有序
	//分割遞歸至每個(gè)子序列只有一個(gè)元素
	_MergeSort(a,left,mid,tmp);
	_MergeSort(a, mid+1,right, tmp);
 
	//歸并
	int begin1 = left, end1 = mid;
	int begin2 = mid + 1, end2 = right;
	int index = left;
 
	while (begin1<=end1&&begin2<=end2)//有一個(gè)子序列遍歷完,循環(huán)結(jié)束
	{
		if (a[begin1] < a[begin2])//升序,取小
		{
			tmp[index++] = a[begin1++];
 
		}
		else
		{
			tmp[index++] = a[begin2++];
		}
	}
 
	//判斷子序列是否遍歷完,未遍歷完畢的子序列剩余元素直接給到tmp數(shù)組
	while (begin1 <= end1)
	{
		tmp[index++] = a[begin1++];
	}
 
	while (begin2<=end2)
	{
		tmp[index++] = a[begin2++];
	}
 
	//拷貝回去
	for (int i=left;i<=right;++i)
	{
		a[i] = tmp[i];
	}
}
 
//歸并排序
void MergeSort(int *a,int n)
{
	int* tmp=(int*)malloc(sizeof(int)*n);//動(dòng)態(tài)開辟與待排序數(shù)組大小相等的一片連續(xù)的空間
	_MergeSort(a,0,n-1,tmp);//子函數(shù)實(shí)現(xiàn)歸并
 
	free(tmp);//釋放動(dòng)態(tài)開辟的空間
}
 
//打印
void Print(int* a, int n)
{
	for (int i=0;i<n;++i)
	{
		printf("%d ",a[i]);
	}
}
int main()
{
	int a[] = {10,6,7,1,3,9,4,2};
	MergeSort(a,sizeof(a)/sizeof(a[0]));
	Print(a,sizeof(a)/sizeof(a[0]));
	return 0;
}

1.5 歸并排序的特性總結(jié)

  • 1. 歸并的缺點(diǎn)在于需要O(N)的空間復(fù)雜度,歸并排序的思考更多的是解決在磁盤中的外排序問 題。
  • 2. 時(shí)間復(fù)雜度:O(N*logN)
  • 3. 空間復(fù)雜度:O(N)
  • 4. 穩(wěn)定性:穩(wěn)定

到此這篇關(guān)于C語言常見排序算法歸并排序的文章就介紹到這了,更多相關(guān)C語言歸并排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++ 實(shí)現(xiàn)稀疏矩陣的壓縮存儲(chǔ)的實(shí)例

    C++ 實(shí)現(xiàn)稀疏矩陣的壓縮存儲(chǔ)的實(shí)例

    這篇文章主要介紹了C++ 實(shí)現(xiàn)稀疏矩陣的壓縮存儲(chǔ)的實(shí)例的相關(guān)資料,M*N的矩陣,矩陣中有效值的個(gè)數(shù)遠(yuǎn)小于無效值的個(gè)數(shù),且這些數(shù)據(jù)的分布沒有規(guī)律,需要的朋友可以參考下
    2017-07-07
  • C++實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能

    C++實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • C++11各種鎖的具體使用

    C++11各種鎖的具體使用

    本文主要介紹了C++11各種鎖的具體使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C++實(shí)現(xiàn)LeetCode(199.二叉樹的右側(cè)視圖)

    C++實(shí)現(xiàn)LeetCode(199.二叉樹的右側(cè)視圖)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(199.二叉樹的右側(cè)視圖),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 二叉搜索樹源碼分享

    二叉搜索樹源碼分享

    這篇文章主要介紹了二叉搜索樹源碼,需要的朋友可以參考下
    2014-04-04
  • c++中的指針最全總結(jié)

    c++中的指針最全總結(jié)

    指針是整個(gè)C++的精髓所在,只有精通了指針才可以說是掌握了C++,可以說學(xué)習(xí)C++的過程是個(gè)熟練掌握和使用指針的過程,下面這篇文章主要給大家介紹了關(guān)于c++中指針的相關(guān)資料,需要的朋友可以參考下
    2024-04-04
  • C++之BOOST字符串查找示例

    C++之BOOST字符串查找示例

    這篇文章主要介紹了C++之BOOST字符串查找的方法,實(shí)例演示了boost針對(duì)字符串的查找、判定及替換等操作,具有一定的實(shí)用價(jià)值,需要的朋友可以參考下
    2014-10-10
  • Unity3D實(shí)現(xiàn)經(jīng)典小游戲Pacman

    Unity3D實(shí)現(xiàn)經(jīng)典小游戲Pacman

    這篇文章主要介紹了基于Unity3D制作一做個(gè)經(jīng)典小游戲Pacman,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Unity3D有一定的幫助,感興趣的小伙伴可以了解一下
    2021-12-12
  • C語言的冒泡排序和快速排序算法使用實(shí)例

    C語言的冒泡排序和快速排序算法使用實(shí)例

    這篇文章主要介紹了C語言的冒泡排序和快速排序算法使用實(shí)例,示例題目也是ACM練習(xí)當(dāng)中的基礎(chǔ)習(xí)題,需要的朋友可以參考下
    2015-08-08
  • C++淺析內(nèi)存分區(qū)模型概念與示例

    C++淺析內(nèi)存分區(qū)模型概念與示例

    在了解內(nèi)存分區(qū)之前,我們先來聊一聊為什么要進(jìn)行內(nèi)存分區(qū)。在進(jìn)行了內(nèi)存分區(qū)之后,在不同的區(qū)域存放的數(shù)據(jù),會(huì)有不同的生命周期,從而會(huì)讓程序員的編程變得更加靈活
    2022-09-09

最新評(píng)論

朝阳区| 页游| 遵义县| 遂川县| 广昌县| 社旗县| 紫金县| 微山县| 抚远县| 扎赉特旗| 中阳县| 娄烦县| 拉萨市| 通江县| 罗甸县| 恩平市| 连云港市| 洮南市| 长武县| 麻城市| 盖州市| 祥云县| 吉安市| 柯坪县| 汝州市| 克什克腾旗| 额尔古纳市| 多伦县| 柳州市| 西乌珠穆沁旗| 赤城县| 高州市| 哈巴河县| 竹溪县| 宜君县| 日照市| 年辖:市辖区| 建瓯市| 津市市| 塔城市| 蛟河市|