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

超詳細(xì)解析C++實(shí)現(xiàn)歸并排序算法

 更新時(shí)間:2022年09月26日 10:05:33   作者:sunny-ll  
歸并排序是比較穩(wěn)定的排序方法。它的基本思想是把待排序的元素分解成兩個(gè)規(guī)模大致相等的子序列。本文將用C++實(shí)現(xiàn)這一排序算法,需要的可以參考一下

一、前言

分治算法

歸并排序,其實(shí)就是一種分治算法 ,那么在了解歸并排序之前,我們先來看看什么是分治算法。在算法設(shè)計(jì)中,我們引入分而治之的策略,稱為分治算法,其本質(zhì)就是將一個(gè)大規(guī)模的問題分解為若干個(gè)規(guī)模較小的相同子問題,分而治之。

分治算法解題方法

1.分解:

將要解決的問題分解為若干個(gè)規(guī)模較小、相互獨(dú)立、與原問題形式相同的子問題。

2.治理:

求解各個(gè)子問題。由于各個(gè)子問題與原問題形式相同,只是規(guī)模較小而已,而當(dāng)子問題劃分得足夠小時(shí),就可以用簡單的方法解決。

3.合并

按原問題的要求,將子問題的解逐層合并構(gòu)成原問題的解。

二、歸并排序

1.問題分析

歸并排序是比較穩(wěn)定的排序方法。它的基本思想是把待排序的元素分解成兩個(gè)規(guī)模大致相等的子序列。如果不易分解,將得到的子序列繼續(xù)分解,直到子序列中包含的元素個(gè)數(shù)為1。因?yàn)閱蝹€(gè)元素的序列本身就是有序的,此時(shí)便可以進(jìn)行合并,從而得到一個(gè)完整的有序序列。

2.算法設(shè)計(jì)

(1)分解:

將待排序的元素分成大小大致一樣的兩個(gè)子序列。

(2)治理:

對(duì)兩個(gè)子序列進(jìn)行個(gè)并排序。

(3)合并:

將排好序的有序子序列進(jìn)行合并,得到最終的有序序列。

3.算法分析

首先我們先給定一個(gè)無序的數(shù)列(42,15,20,6,8,38,50,12),我們進(jìn)行合并排序數(shù)列,如下圖流程圖所示:

步驟一:首先將待排序的元素分成大小大致相同的兩個(gè)序列。

步驟二:再把子序列分成大小大致相同的兩個(gè)子序列。

步驟三:如此下去,直到分解成一個(gè)元素停止,這時(shí)含有一個(gè)元素的子序列都是有序的。

步驟四:進(jìn)行合并操作,將兩個(gè)有序的子序列合并為一個(gè)有序序列,如此下去,直到所有的元素都合并為一個(gè)有序序列。

舉例,下面我將以序列(4,9,15,24,30,2,6,18,20)進(jìn)行圖解。

(1)初始化:i = low,j = mid+1,mid = (low+hight)/2 ,申請(qǐng)一個(gè)輔助數(shù)組 b

int* b = new int[hight - low + 1];  //用 new 申請(qǐng)一個(gè)輔助函數(shù)
	int i = low, j = mid + 1, k = 0;    // k為 b 數(shù)組的小標(biāo)

 (2)現(xiàn)在比較 a [i]  和 b[j]  ,將較小的元素放在 b 數(shù)組中,相應(yīng)的指針向后移動(dòng),直到 i > mid 或者 j>hight 時(shí)結(jié)束。

while (i <= mid && j <= hight)  
 {
	if (a[i] <= a[j])
	{
		b[k++] = a[i++];  //按從小到大存放在 b 數(shù)組里面
	}
	else
	{
		b[k++] = a[j++];
	}
  }

進(jìn)行第一次比較 a[i]=4  和 a[j]=2,將較小的元素 2 放入數(shù)組  b  中,j++,k++,如下圖:

進(jìn)行第二次比較 a[i]=4  和 a[j]=6,將較小的元素放 4 入數(shù)組  b  中,i++,k++,如下圖:

進(jìn)行第三次比較 a[i]=9  和 a[j]=6,將較小的元素放 6 入數(shù)組  b  中,j++,k++,如下圖:

進(jìn)行第四次比較 a[i]=9  和 a[j]=18,將較小的元素放 9 入數(shù)組  b  中,i++,k++,如下圖:

進(jìn)行第五次比較 a[i]=15  和 a[j]=18,將較小的元素放 15 入數(shù)組  b  中,i++,k++,如下圖:

進(jìn)行第六次比較 a[i]=24  和 a[j]=18,將較小的元素放 18 入數(shù)組  b  中,j++,k++,如下圖:

進(jìn)行第七次比較 a[i]=24  和 a[j]=20,將較小的元素放 20 入數(shù)組  b  中,j++,k++,如下圖:

此時(shí),j>hight 了,while循環(huán)結(jié)束,但 a 數(shù)組還剩下元素(i<mid)可直接放入  b  數(shù)組就可以了。如下圖所示:

while (i <= mid)  // j 序列結(jié)束,將剩余的 i 序列補(bǔ)充在 b 數(shù)組中 
	{
		b[k++] = a[i++];
	}
	while (j <= hight)// i 序列結(jié)束,將剩余的 j 序列補(bǔ)充在 b 數(shù)組中 
	{
		b[k++] = a[j++];
	}

現(xiàn)在將  b  數(shù)組的元素賦值給 a 數(shù)組,再將 b  數(shù)組銷毀,即可。

for (int i = low; i <= hight; i++)  //將 b 數(shù)組的值傳遞給數(shù)組 a
	{
		a[i] = b[k++];
	}
	delete[]b;     // 輔助數(shù)組用完后,將其的空間進(jìn)行釋放(銷毀)

(3)遞歸的形式進(jìn)行歸并排序

void mergesort(int* a, int low, int hight) //歸并排序
{
	if (low < hight)
	{
		int mid = (low + hight) / 2;
		mergesort(a, low, mid);          //對(duì) a[low,mid]進(jìn)行排序
		mergesort(a, mid + 1, hight);    //對(duì) a[mid+1,hight]進(jìn)行排序
		merge(a, low, mid, hight);       //進(jìn)行合并操作
	}
}

三、AC代碼

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>
using namespace std;
void merge(int* a, int low, int mid, int hight)  //合并函數(shù)
{
	int* b = new int[hight - low + 1];  //用 new 申請(qǐng)一個(gè)輔助函數(shù)
	int i = low, j = mid + 1, k = 0;    // k為 b 數(shù)組的小標(biāo)
	while (i <= mid && j <= hight)  
	{
		if (a[i] <= a[j])
		{
			b[k++] = a[i++];  //按從小到大存放在 b 數(shù)組里面
		}
		else
		{
			b[k++] = a[j++];
		}
	}
	while (i <= mid)  // j 序列結(jié)束,將剩余的 i 序列補(bǔ)充在 b 數(shù)組中 
	{
		b[k++] = a[i++];
	}
	while (j <= hight)// i 序列結(jié)束,將剩余的 j 序列補(bǔ)充在 b 數(shù)組中 
	{
		b[k++] = a[j++];
	}
	k = 0;  //從小標(biāo)為 0 開始傳送
	for (int i = low; i <= hight; i++)  //將 b 數(shù)組的值傳遞給數(shù)組 a
	{
		a[i] = b[k++];
	}
	delete[]b;     // 輔助數(shù)組用完后,將其的空間進(jìn)行釋放(銷毀)
}
void mergesort(int* a, int low, int hight) //歸并排序
{
	if (low < hight)
	{
		int mid = (low + hight) / 2;
		mergesort(a, low, mid);          //對(duì) a[low,mid]進(jìn)行排序
		mergesort(a, mid + 1, hight);    //對(duì) a[mid+1,hight]進(jìn)行排序
		merge(a, low, mid, hight);       //進(jìn)行合并操作
	}
}
int main()
{
	int n, a[100];
	cout << "請(qǐng)輸入數(shù)列中的元素個(gè)數(shù) n 為:" << endl;
	cin >> n;
	cout << "請(qǐng)依次輸入數(shù)列中的元素:" << endl;
	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
	}
	mergesort(a, 0, n-1);
	cout << "歸并排序結(jié)果" << endl;
	for (int i = 0; i < n; i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;
	return 0;
}

以上就是超詳細(xì)解析C++實(shí)現(xiàn)歸并排序算法的詳細(xì)內(nèi)容,更多關(guān)于C++歸并排序算法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 關(guān)于C語言操作符的那些事(超級(jí)全)

    關(guān)于C語言操作符的那些事(超級(jí)全)

    這篇文章主要給大家介紹了關(guān)于C語言操作符的那些事兒,c語言的操作符有很多,包括算術(shù)操作符、移位操作符、位操作符、賦值操作符、單目操作符、關(guān)系操作符、邏輯操作符、條件操作符、逗號(hào)表達(dá)式、下標(biāo)引用、函數(shù)調(diào)用和結(jié)構(gòu)成員,需要的朋友可以參考下
    2021-08-08
  • C語言連接并操作Sedna XML數(shù)據(jù)庫的方法

    C語言連接并操作Sedna XML數(shù)據(jù)庫的方法

    這篇文章主要介紹了C語言連接并操作Sedna XML數(shù)據(jù)庫的方法,實(shí)例分析了C語言操作XML文件的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • 詳解C語言中二級(jí)指針與鏈表的應(yīng)用

    詳解C語言中二級(jí)指針與鏈表的應(yīng)用

    對(duì)于初學(xué)者而言,有很多地方肯定是費(fèi)解的。比如函數(shù)的參數(shù)列表的多樣化,動(dòng)態(tài)分配內(nèi)存空間函數(shù)malloc等,其實(shí)這些知識(shí)和指針聯(lián)系緊密,尤其是二級(jí)指針,快跟隨小編來學(xué)習(xí)一下吧
    2022-07-07
  • C語言強(qiáng)制類型轉(zhuǎn)換規(guī)則實(shí)例詳解

    C語言強(qiáng)制類型轉(zhuǎn)換規(guī)則實(shí)例詳解

    強(qiáng)制類型轉(zhuǎn)換是把變量從一種類型轉(zhuǎn)換為另一種數(shù)據(jù)類型,下面這篇文章主要給大家介紹了關(guān)于C語言強(qiáng)制類型轉(zhuǎn)換的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • c++ bitset詳解

    c++ bitset詳解

    這篇文章主要介紹了C++ bitset用法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • C++實(shí)現(xiàn)五子棋游戲

    C++實(shí)現(xiàn)五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++實(shí)戰(zhàn)之二進(jìn)制數(shù)據(jù)處理與封裝

    C++實(shí)戰(zhàn)之二進(jìn)制數(shù)據(jù)處理與封裝

    在電腦上一切數(shù)據(jù)都是通過二進(jìn)制(0或1)進(jìn)行存儲(chǔ)的,通過多位二進(jìn)制數(shù)據(jù)可以進(jìn)而表示整形、浮點(diǎn)型、字符、字符串等各種基礎(chǔ)類型數(shù)據(jù)或者一些更復(fù)雜的數(shù)據(jù)格式。本文將為大家詳細(xì)講講二進(jìn)制數(shù)據(jù)處理與封裝,需要的可以參考一下
    2022-08-08
  • C語言中的long型究竟占4個(gè)字節(jié)還是8個(gè)字節(jié)(遇到的坑)

    C語言中的long型究竟占4個(gè)字節(jié)還是8個(gè)字節(jié)(遇到的坑)

    小編在復(fù)習(xí)C語言的時(shí)候踩到了不少坑,糾結(jié)long類型究竟占4個(gè)字節(jié)還是8個(gè)字節(jié)呢?好,今天通過本文給大家分享下我的詳細(xì)思路,感興趣的朋友跟隨小編一起看看吧
    2021-11-11
  • C++實(shí)現(xiàn)一鍵關(guān)閉桌面的示例代碼

    C++實(shí)現(xiàn)一鍵關(guān)閉桌面的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C++實(shí)現(xiàn)一鍵關(guān)閉桌面的功能,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-07-07
  • C C++ 題解LeetCode2360圖中的最長環(huán)示例

    C C++ 題解LeetCode2360圖中的最長環(huán)示例

    這篇文章主要為大家介紹了C C++ 題解LeetCode2360圖中的最長環(huán)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10

最新評(píng)論