從題目看,首先不是全部是若干。排序演算法很多,我個人的能力也有限,不可能都講到。另外,是簡單彙總,是希望能用最簡單的**,最簡短的語言說明問題,不搞太多理論分析。
就像前面說的,排序演算法有很多,而且不存在哪一種最不好,哪一種最好這樣的說法。根據用途不同選擇最適合的就行了。不過僅從時間複雜度來看,基本上有兩種,一種是o(n^2), 一種是o(nlogn)。
所謂的時間複雜度,其實是基於多少次基本操作定義的,在排序演算法中,基本操作指兩類,一是比較,二是記錄從乙個位置移動另乙個位置。下面講到的排序演算法都會涉及到這些操作。
一直接插入排序
先從乙個最簡單的切入。它的思種是這樣的,把乙個數插入到已排好的序列中。比如已有乙個有序序列:
現在有乙個數18要插入進來,並且保證插入後序列還是有序。18開始和序列中的所有數逐一比較(從右向左比較),比40小,40後移,比25小,25後移,比23小,23後移,跟12比,發現比12大,停在這裡,插入到23的位置,最終變為:
上面的過程叫一趟插入排序,基於這個思想, 我們可以認為陣列第乙個元素是有序的,所以可以從第二個元素開始,每個元素都做一趟插入排序就可以得到乙個有序序列。**就很簡單了,
[cpp]view plain
copy
intinsertsort(
intnarray,
intnlength)
narray[j+1] = nserity;
} }
return
0;
}
很容易看出它的時間複雜度是o(n^2)
二氣泡排序
這個排序演算法基本是大學老師必講的,因為它除了簡單之外,也確實比較好玩。思路是這樣的,乙個無序序列a[n], a[1]和a[2]比較,如果a[1]>a[2], 它們就交換位置,否則不做處理。繼續a[2]和a[3]同樣的原理比較,一直到a[n-1]和a[n]比較。
上面的過程叫一趟冒泡,請你在腦海裡想像下這個過程,我下面要說的這個結論希望你能想明白,那就是經過一趟冒泡後,序列中最大的那個元素已經被換到a[n]的位置了。有沒有覺得這個過程就像冒泡一樣,只不過這個泡是向下冒的。
做第二趟冒泡時,只要對a[1]~a[n-1]操作就行了,結果是序列中第二大的那個元素在a[n-1]的位置了。然後經過n趟冒泡後,排序就完成了。
通過上面的過程也很容易得出氣泡排序的時間複雜度是o(n^2),可以上**了,
[cpp]view plain
copy
//bchange作用是為了對於已排好序的序列,能
//及時退出來。
intbubblesort(
intnarray,
intnlength)
} } return
0;
}
可以好好理解一下**中bchange變數的作用,這裡不多說解釋了,留給大家思考。
這篇就打算寫這麼多了,主要篇幅太長怕大家看著厭煩,過幾天有空了再接著寫吧。
或
排序演算法 排序演算法彙總
排序演算法無疑是學習資料結構中的重點內容,本文將給出排序演算法的彙總。下面是具體的實現 include include include define n 1000000 int array n int temp n 1 氣泡排序 void bubblesort int a,int n if tag ...
排序演算法 排序演算法彙總
排序演算法無疑是學習資料結構中的重點內容,本文將給出排序演算法的彙總。下面是具體的實現 include include include define n 1000000 int array n int temp n 1 氣泡排序 void bubblesort int a,int n if tag ...
排序演算法 排序演算法彙總
排序演算法無疑是學習資料結構中的重點內容,本文將給出排序演算法的彙總。下面是具體的實現 include include include define n 1000000 int array n int temp n 1 氣泡排序 void bubblesort int a,int n if tag ...