基礎實在差的太多,(貼的代碼太多,做的思考太少,和大佬差距越來越大,現在開始刷書也不知道到底來不來得及)
真是應了那句話,無論什麼事,在結束之前,最壞的結果不過就是重頭再來。
第三章初等排序
3.1挑戰問題之前——排序
排序主要注意三點:
1.複雜度與穩定性(穩定是指當數據中存在2個或者2個以上鍵值相等的元素時,這些元素在排序處理前後順序不變。)
2.除保存數據的數組以外是否還需要額外內存
3.輸入數據的特徵是否會對複雜度造成影響
3.2插入排序
數組分爲兩部分:一部分爲已排序部分,一部分爲未排序部分。
執行下述,直至未排序部分消失:
1.取出未排序部分的開頭賦給變量v;
2.在已排序的的部分,將所有比v大的元素向後移動一個單位。
3.將以取出的元素插入空位
模板
int csort(int a[],int n){
int v,j;
for(int i=1;i<n;i++){
v=a[i];
j=i-1;
while(j>=0&&a[j]>v){
a[j+1]=a[j];
j--;
}
a[j+1]=v;
print(a,n);
}
}
3.3冒泡排序
重複執行下述處理,直到數組中不包含順序相反的相鄰元素
從數組末尾開始依次比較相鄰的兩個元素,如果大小相反則交換位置。
模板
int bsort(int a[],int n){
int flag=1;
int sw=0;//記錄交換次數(又稱爲反序數或逆序數,可用於體現數列的錯亂程度)
while(flag){
flag=0;
for(int j=n-1;j>=1;j--){
if(a[j]<a[j-1]){
swap(a[j],a[j-1]);
flag=1;
sw++;
}
}
}
}
3.4選擇排序
每次找出數組中最小的數字,放置相應位置,完成排序
重複執行n-1次下述處理
1.找出未排序部分的最小值minj;
2.將minj位置的元素和未排序部分的起始元素進行交換;
模板
int ssort(int a[],int n){
int minj;
for(int i=0;i<n;i++){
minj=i;
for(int j=i;j<n;j++){
if(a[j]<a[minj]){
minj=j;
}
}
swap(a[i],a[minj]);
}
}
小結:冒泡與選擇相比,一個從局部入手減少逆序數,一個全局逐個選擇最小值,思路不同,但是都是“通過i次外層循環,從數據中求出i個最小值” 相對地,插入排序是通過i次外層循環,直接將原數組的i個元素重新排序。
三種排序方法都是N²的時間複雜度 插入和冒泡均是穩定排序,選擇排序爲不穩定排序插入排序的優勢在可以快速處理相對有序的數列.
3.5穩定排序(沒啥好說的,選擇排序不穩定...)
3.6希爾排序
其實是插入排序的升級版?按一定區間長度排序,然後再細化?有點難...放一放..還有一篇的解釋似乎挺詳細.