天天看點

用函數的方法通過冒泡法實作對一個數組(亂序)到有序排序(由大到小排序)

用函數的方法通過冒泡法實作對一個數組(亂序)到有序排序(由大到小排序)

對于初步接觸冒泡排序的小白來說,冒泡排序是一個未知的概念!

什麼是冒泡排序??筆者:下面引用百度百科的搜尋結果,僅供大家參考!

冒泡排序(Bubble Sort),是一種計算機科學領域的較簡單的排序算法。它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果順序(如從大到小、首字母從Z到A)錯誤就把他們交換過來。走訪元素的工作是重複地進行,直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。這個算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端(升序或降序排列),就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端一樣,故名“冒泡排序”。”

顧名思義:簡短來說:冒泡排序就是對相鄰的兩個元素按照順序(比較大小,看個人意願),一直行排序,直到按照某一順序排列(由大到小,或者由小到大),直至排序完成!

下面請看:實作對一個亂序數組的由大到小排序的過程!

這個是冒泡排序的第一趟,一共執行數組的大小減1趟

用函數的方法通過冒泡法實作對一個數組(亂序)到有序排序(由大到小排序)

 在這裡面,(實作對亂序數組的由大到小排序)不懂得可以看着此圖,結合定義來進行思考!

希望大家能夠認真思考!然後再結合筆者代碼進行.......

已經到此地步,我想,讀者應該對于冒泡排序有了大緻的了解與認識!

下面請看筆者所寫的:

用函數的方法通過冒泡法實作對一個數組(亂序)到有序排序(由大到小排序)的代碼

//實作一個對整形數組的冒泡排序

//由大到小排序

//實作一個對整形數組的冒泡排序
//由大到小排序
#include <stdio.h>
void maopao(int arr[], int sz)
{
	int i = 0;
	int j = 0;
	
	///确定冒泡排序趟數
	for(i=0;i<=sz-1;i++)
	{     /*每一趟的冒泡排序進行幾次(總趟數(次數)去掉沉底的)*/
		//int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] < arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
			
		}

	}
}
int main()
{
	int i = 0;
	int arr[10] = { 1,5,6,4,8,2,10,9,3,7 };
	int sz = 0;
	sz=sizeof(arr) / sizeof(arr[0]);
	//printf("sz=%d\n", sz);     //計算得出sz=10
	for (i = 0; i < 10; i++)
	{
		printf(" % d ", arr[i]);
	}
	printf("\n");
	maopao(arr, sz);
	
	for (i = 0; i < 10; i++)
	{
		printf(" %d  ", arr[i]);
	}
}
           

在這個代碼裡面,一開始筆者将sz=sizeof(arr) / sizeof(arr[0]);放在了函數體部分來進行就值,但是完成整體代碼調試之後發現,sz的值為1,但是通過計算可以得出sz的值為10,但是這又是為什麼呢??

具體思考一會,筆者發現sz的值隻能通過實參來傳給形參,不能在函數體部分來求!

原因是:數組傳參:是将數組的首元素位址通過實參傳給形參,然後形參接收首元素位址(僅占四個位元組,32個比特位)然後數組的第一個原始arr[0]也是四個位元組(32個比特位),是以結果是1;是以出現了錯誤!

故,sz隻能在main函數裡面來求,通過實參來傳給函數體部分!

for(i=0;i<=sz-1;i++)
	{     /*每一趟的冒泡排序進行幾次(總趟數(次數)去掉沉底的)*/
		//int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] < arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
			
		}

	}
           

 在這個代碼塊中,需要着重注意一下,确定冒泡排序的趟數,及其每一趟,需要排序的次數(沒執行一趟冒泡排序,需要進行排序的次數都在改變,細心的不難發現規律)!!

代碼的運作結果請看:

用函數的方法通過冒泡法實作對一個數組(亂序)到有序排序(由大到小排序)

到此為止,筆者想要表達的已經全部表達出來,對于沒有提及的部分,請大家及時聯系筆者.......

繼續閱讀