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

C語言遞歸實現(xiàn)歸并排序詳解

 更新時間:2022年03月01日 15:31:07   作者:Icy?Hunter  
這篇文章主要為大家詳細介紹了C語言遞歸實現(xiàn)歸并排序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,?希望能夠給你帶來幫助

歸并排序遞歸實現(xiàn)還是比較難理解的,感覺涉及遞歸一般理解起來都會比較有難度吧,但是看了b站視頻,然后照著打下來,然后自己寫了點注釋,就發(fā)現(xiàn)不知不覺都大概懂了。

這里的歸并講的是升序排序

歸并排序思路大概就是:先劃分數(shù)組,將數(shù)組劃分為左右半?yún)^(qū),分成的左右半?yún)^(qū),各自再劃分左右半?yún)^(qū),一直劃分,直到最后左右半?yún)^(qū)的元素都為一個時,開始合并,因為都劃分為一個元素了,那么此時兩個元素的排序就非常簡單了,只需要比較大小就可以排序了,那么回溯上去會發(fā)現(xiàn)每組都是兩兩有序了,那么直接再依次比較兩組之間的排頭元素即可,取較小的賦值給臨時數(shù)組,然后排頭元素就變成后一個元素,一直這么比較,直到兩組數(shù)據(jù)有一組為空時,只需要將另一組不為空的接在臨時數(shù)組后面即可,因為此時不為空的剩下的元素是有序的且都比此時有序的臨時數(shù)組大,接完之后臨時數(shù)組就變成有序的數(shù)組了,那么再將臨時數(shù)組的元素復制到實際數(shù)組中去,最后釋放臨時數(shù)組空間,輸出實際數(shù)組,歸并排序結(jié)束,輸出的元素也是排好序的元素了。

這樣干講一定很抽象

這是b站視頻里的圖,十分生動形象了吧。

在這里插入圖片描述

代碼如下(除了視頻里的注釋,還加了點自己的注釋)

#include<bits/stdc++.h>
using namespace std;
void print_arr(int arr[], int n){
	for(int i=0; i<n; i++){
		printf("%d ", arr[i]);
	}
	printf("\n"); 
}
//合并 
void merge(int arr[], int tempArr[], int left, int mid, int right){
	//標記左半?yún)^(qū)第一個未排序元素
	int l_pos = left; 
	//標記右半?yún)^(qū)第一個未排序元素 
	int r_pos = mid+1;
	//合并數(shù)組由左右半?yún)^(qū)構(gòu)成,臨時數(shù)組的開始位置也就是左半?yún)^(qū)的開始位置 
	int pos = left;
	//合并
	//劃分剛結(jié)束后左右半?yún)^(qū)其實各自只有一個元素,那么直接比較大小即為兩個元素的排序。 
	while(l_pos <= mid && r_pos <= right){//當左右半?yún)^(qū)都含有元素時 
		if(arr[l_pos] < arr[r_pos]) //左半?yún)^(qū)第一個剩余元素更小 
		     tempArr[pos++] = arr[l_pos++];//賦值后pos+1,l_pos+1為下一次做準備 
	    else //右半?yún)^(qū)第一個剩余元素更小 
		     tempArr[pos++] = arr[r_pos++];
	}
	//當右半?yún)^(qū)元素合并完后左半?yún)^(qū)還有元素剩余,此時右半?yún)^(qū)有序且都比左半?yún)^(qū)元素大
	//那么直接將剩余的右半?yún)^(qū)元素接上即可 
	//合并左半?yún)^(qū)剩余的元素
	while(l_pos <= mid)tempArr[pos++] = arr[l_pos++]; 
	//同理 
	//合并右半?yún)^(qū)剩余的元素
	while(r_pos <= right)tempArr[pos++] = arr[r_pos++];
	//把臨時數(shù)組中合并后的元素復制回原來的數(shù)組
	//tempArr此時已有序,只需利用left,right即排完序后的左右半?yún)^(qū)復制回arr數(shù)組即可 
	while(left <= right){
		arr[left] = tempArr[left];
		left++;
	}
}
//歸并排序 
void msort(int arr[], int tempArr[], int left, int right){
	//如果只有一個元素,那么就不需要繼續(xù)劃分
	//由 mid = (left + right) / 2得,當只剩最后一個數(shù)時 mid會和left和right相等
	//即傳入后的left和right會相等 
	if(left < right){  //left和right不相等,不止一個元素,需要繼續(xù)劃分 
		//找中間點 
		int mid = (left + right) / 2;
		//遞歸劃分左半?yún)^(qū) 
		msort(arr, tempArr, left, mid);
		//遞歸劃分右半?yún)^(qū) 
		msort(arr, tempArr, mid+1, right); 
		//當數(shù)組劃分完畢時開始進行合并 
		//合并已經(jīng)排序的部分 
		//left為左半?yún)^(qū)左邊界
		//right為右半?yún)^(qū)右邊界
		//mid為劃分左右半?yún)^(qū)的分界(也是左半?yún)^(qū)的右邊界) 
		merge(arr, tempArr, left, mid, right);
	} 
}
//歸并入口 
void merge_sort(int arr[], int n){
	//分配一個輔助的數(shù)組,內(nèi)存大小為 數(shù)組數(shù)*數(shù)據(jù)類型占位 
	int* tempArr = (int*)malloc(n * sizeof(int));
	 if(tempArr){
	 	//tempArr為臨時數(shù)組, arr為需要排序的數(shù)組
		//排序下標為0至n-1,n為數(shù)組大小 
	 	msort(arr, tempArr, 0, n-1);
	 	free(tempArr);//釋放內(nèi)存空間 
	 }
	 else{
	 	printf("meet error");
	 }
}
int main(){
	int arr[] = {9, 5, 2, 7, 12, 4, 3, 1, 11};
	int n = 9;
	//打印原來的數(shù)組 
	print_arr(arr, n);
	//歸并排序 
	merge_sort(arr, n);
	//打印排完序的數(shù)組 
	print_arr(arr, n);
	return 0;
}

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!  

相關(guān)文章

  • C語言編程C++旋轉(zhuǎn)字符操作串示例詳解

    C語言編程C++旋轉(zhuǎn)字符操作串示例詳解

    這篇文章主要為大家介紹了C語言編程中C++旋轉(zhuǎn)字符操作串示例詳解,文中附含詳細圖文示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-09-09
  • Qt實現(xiàn)手動切換多種布局的完美方案

    Qt實現(xiàn)手動切換多種布局的完美方案

    通過點擊程序界面上不同的布局按鈕,使主工作區(qū)呈現(xiàn)出不同的頁面布局,多個布局之間可以通過點擊不同布局按鈕切換,支持的最多的窗口為9個,不同布局下窗口數(shù)隨之變化,這篇文章主要介紹了Qt實現(xiàn)手動切換多種布局的完美方案,需要的朋友可以參考下
    2024-07-07
  • 基于C++編寫一個密碼系統(tǒng)

    基于C++編寫一個密碼系統(tǒng)

    這篇文章主要為大家詳細介紹了如何基于C++編寫一個簡單的密碼系統(tǒng),文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-11-11
  • 從頭學習C語言之switch語句和分支嵌套

    從頭學習C語言之switch語句和分支嵌套

    這篇文章主要為大家詳細介紹了C語言之switch語句和分支嵌套,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • 通過C++獲取CPU占用率的代碼示例(windows、linux、macOS)

    通過C++獲取CPU占用率的代碼示例(windows、linux、macOS)

    本文介紹了在Windows、Linux和macOS平臺下使用C++獲取CPU占用率的多種方法,包括系統(tǒng)整體CPU占用率和特定進程CPU占用率的計算公式和實現(xiàn)代碼示例,需要的朋友可以參考下
    2025-03-03
  • C語言中返回錯誤信息的相關(guān)函數(shù)用法總結(jié)

    C語言中返回錯誤信息的相關(guān)函數(shù)用法總結(jié)

    這篇文章主要介紹了C語言中返回錯誤信息的相關(guān)函數(shù)用法總結(jié),包括strerror()函數(shù)和perror()函數(shù)以及ferror()函數(shù)的使用,需要的朋友可以參考下
    2015-09-09
  • C++中范圍(Ranges)與視圖(Views)的常見問題、易錯點

    C++中范圍(Ranges)與視圖(Views)的常見問題、易錯點

    ranges和views是C20引入的重要特性,它們讓代碼更加簡潔、高效且富有表達力,通過理解其基本概念、注意常見的陷阱,并合理應用高級技巧,開發(fā)者可以充分利用這些新特性,提升軟件質(zhì)量和開發(fā)效率,,本文將深入淺出地探討ranges與views的基礎(chǔ)概念、常見問題、易錯點及避免策略
    2024-06-06
  • C++實現(xiàn)查詢本機信息的示例代碼

    C++實現(xiàn)查詢本機信息的示例代碼

    這篇文章主要為大家詳細介紹了如何利用C++實現(xiàn)查詢本機信息,并且進行上報,文中的示例代碼講解詳細,具有一定的參考價值,感興趣的可以了解一下
    2023-05-05
  • 基于C語言航班信息查詢與檢索

    基于C語言航班信息查詢與檢索

    這篇文章主要為大家詳細介紹了基于C語言航班信息查詢與檢索,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++學習之命名空間詳解

    C++學習之命名空間詳解

    C++中,命名空間(namespace)是一個重要的概念。命名空間可以為函數(shù)、變量、類等定義作用域,避免與其他定義的名稱發(fā)生沖突。下面我們就來了解一下如何使用C++命名空間,以及一些常見的操作吧
    2023-04-04

最新評論

吉水县| 永昌县| 华阴市| 凤凰县| 内江市| 亚东县| 伊吾县| 木里| 东阿县| 文山县| 正定县| 万年县| 桦南县| 清苑县| 汉阴县| 阿克苏市| 丹东市| 独山县| 阳城县| 钦州市| 卢湾区| 海口市| 五河县| 凌云县| 教育| 临泉县| 桐梓县| 丰原市| 福建省| 大埔县| 广丰县| 长沙市| 察雅县| 墨竹工卡县| 湘乡市| 宜兰市| 淳化县| 永登县| 陆川县| 上林县| 湖北省|