【C語言學習筆記】再論快速排序的重要性與妙用空間

error13發表於2020-10-17

快速排序演算法的重要性

之前有專門寫過一篇部落格講述桶排序、氣泡排序和快速排序的演算法思路和區別優點,傳送門在這裡

在寫了那麼多題目後,除了題目本身就要求對資料排序要用到排序演算法以外,如:絕對值排序——快速排序、氣泡排序

還有像迴旋星空——妙用排序強迫症的序列——思維轉換 細節問題巧妙利用排序演算法簡便思維和複雜度。

但因為C語言沒有內建排序演算法,故在遇到需要排序時往往需要自己編寫排序的函式,而氣泡排序又有超時的風險,故快速排序就是最佳的選擇。


快速排序程式碼

#include <stdio.h>

//define the global variable,this two variable needed to be used in the subfunction.
int a[101],n;

void quicksort ( int left, int right )
{
	int i, j, t, temp;
	if ( left>right )
		return ;
		

	//what is in temp is the reference number. 
	temp = a[left];
	i = left;
	j = right;
	while ( i!=j )
	{
		// the order is important,we need to find the proper value from right side to left side.
		while ( a[j] >= temp && i<j )
			j--;
		//And, find the proper value from left side to right side.
		while ( a[i] <= temp && i<j )
			i++;
		
		//exchange the two value in the sequence.
		//double checked.
		if ( i<j )//when soldier i and soldier j do not meet. 
		{
			t = a[i];
			a[i] = a[j];
			a[j] = t;
		}
	}
	//place the reference number finally. 
	a[left] = a[i];
	a[i] = temp;
	
	//continue to deal with the right side and left side, this is a recursion program.
	quicksort ( left, i-1 );
	quicksort ( i+1, right );

}

int main()
{
	int i, j, t;
	//load the data.
	//attention! start from 1 not 0.
	scanf ( "%d", &n );
	for ( i=1; i<=n; i++ )
 		scanf ( "%d", &a[i] );
	

	//call quicksort function.
	quicksort ( 1, n );
	
	//output the result after ordering.
	for ( i=1; i<=n; i++ )
		printf ( "%d ", a[i] );  
		
	getchar();getchar();
	return 0;

}

快速排序易錯點

1.忘記寫結束遞迴的條件

if ( left>right )
		return ;

尤為重要,個人曾多次忘記寫,因為這不涉及語法錯誤,所以不會報錯,但是執行時會得不到結果,要排查很久。

2.陣列不是全域性變數

若在main函式裡面定義陣列,到了函式裡面就無法使用。(雖然我也有點迷惑,但事實就是如此,會顯示變數沒有申明)

3.main函式傳入的引數不對

一般是第二個引數不對,因為陣列是全域性變數,故預設初始化為0,如果沒有找準right值,(一般)就會導致多引入0排序。

4.語句條件有誤

while語句寫成if語句或if語句寫成while語句…(可能腦子不太好使了)

5.移動方向與順序問題

是j–而不是j++,是j先移動然後才是i

相關文章