【C語言學習筆記】再論快速排序的重要性與妙用空間
快速排序演算法的重要性
之前有專門寫過一篇部落格講述桶排序、氣泡排序和快速排序的演算法思路和區別優點,傳送門在這裡。
在寫了那麼多題目後,除了題目本身就要求對資料排序要用到排序演算法以外,如:絕對值排序——快速排序、氣泡排序
還有像迴旋星空——妙用排序和強迫症的序列——思維轉換 細節問題巧妙利用排序演算法簡便思維和複雜度。
但因為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
相關文章
- C 語言學習筆記筆記
- C語言學習筆記C語言筆記
- C語言再學習C語言
- 【C語言】氣泡排序與快速排序C語言排序
- C語言學習筆記--C運算子C語言筆記
- c語言學習筆記===函式C語言筆記函式
- 【R語言學習筆記】若干排序問題R語言筆記排序
- C語言學習筆記:結構體與指標C語言筆記結構體指標
- C語言學習筆記——位運算C語言筆記
- c語言程式基礎學習筆記C語言筆記
- C語言學習筆記之變數C語言筆記變數
- 初識C語言(01)—學習筆記C語言筆記
- 嵌入式C語言學習筆記2C語言筆記
- C語言/C++對程式設計學習的重要性!C語言C++程式設計
- C語言例項解析精粹學習筆記——19C語言筆記
- C語言學習筆記之指標的運算C語言筆記指標
- linux下c語言學習筆記——操作mysqlLinuxC語言筆記MySql
- 學習不同程式語言的重要性
- go 學習筆記之工作空間Go筆記
- OpenCV 名稱空間學習筆記OpenCV筆記
- 【 PHP 學習筆記 】名稱空間PHP筆記
- [ PHP 學習筆記 ] 名稱空間PHP筆記
- C++學習筆記-C++對C語言的函式擴充C++筆記C語言函式
- C語言學習筆記01--C開源庫uthash的使用C語言筆記
- 組合語言學習筆記組合語言筆記
- 學習筆記----快速排序的java實現及其改良筆記排序Java
- Go 語言學習筆記之陣列與切片Go筆記陣列
- c語言快速排序(庫函式使用)C語言排序函式
- c語言筆記C語言筆記
- C++開發者快速學習Objective-C語言核心語法C++ObjectC語言
- C語言學習方法,怎麼學習C語言?C語言
- DB2學習筆記 - 表空間DB2筆記
- C語言的學習C語言
- C語言學習日記(4)——輸出當前時間C語言
- 12天學好C語言——記錄我的C語言學習之路(Day 4)C語言
- 演算法導論學習之三:排序之C語言實現:選擇排序,插入排序,歸併排序演算法排序C語言
- 熱更新語言--lua學習筆記筆記
- 《JavaScript語言精粹》學習筆記二JavaScript筆記