本文中的前三種排序都是公升序排序,又因為這三個排序的平均時間複雜度都是o(n2),最差情況也都是o(n2),另外這三種排序也是其他排序如快排、希爾排序的基礎,**較少,思想較容易理解,所以放在一塊。
對於排序的思想可以參考嚴蔚敏的《資料結構》的書,也可以參考《大話資料結構》,或者另外一本《妙趣橫生的演算法(c語言實現)》,最後一本書只推薦前三章,後面的章節有點偏數學的應用
另外感覺希爾排序是基於氣泡排序的,**和思想相對堆排序、快排、歸併都簡單一些,所以補充進來
氣泡排序
就是交換相鄰的兩個數,每次排完序之後都會出現乙個最大數,第二次排序就是在前n-1個數排序,第i次排序就是前n-i個數排序
**如下:
void swap(int *s,int *t)
void bubblesort(int a,int n)
}}
對於如此簡單的乙個冒泡的程式,我在寫的時候也是出了一些問題,關鍵就是第二個for迴圈怎麼寫的問題:
1.我們知道最外層的排序的次數肯定是n次,內層for迴圈的次數j<?,我們知道每次都會出現乙個最大數,所以迴圈次數肯定有n-i,但是是不是就是n-i?,假設最簡單的n=1,那麼內層不應該迴圈,因為只有乙個數,如果是n-i,那麼就是i=0;i<1,就需要迴圈一次,明顯不對,此時應該是i=0,j<1-0-1,也就是j
2.其實初始條件我先開始寫成j=i了,但是仔細一想,每次都是從頭重新比較
有了這兩點,相信氣泡排序就不會寫錯了
改進版的氣泡排序,原理就是當所有的比較之後,發現都不需要交換時,此時肯定已經有序
**如下:
void bubblesort2(int a,int n)
} if(flag==0) break;
}}
選擇排序
就是每次都選擇當前無序陣列中的乙個最大數的與陣列的最後乙個數交換,我相信寫過了求乙個陣列中的最大數之後,再寫選擇排序就迎刃而解
void selectionsort(int a,int n)
} if(j-1!=k)
swap(&a[j-1],&a[k]);
}}
寫選擇排序的時候,沒有碰到什麼問題,就是max的時候,同時需要乙個下標變數,記住這個最大數所在的位置,這樣交換的時候才知道是哪兩個數交換,但是第二個for迴圈和冒泡的不同,因為當n=1時,內層總是需要找出最大的那個值,需要迴圈一次,所以推導是n-i,最開始寫的時候忽略了第二個if條件,後來補上
插入排序
這個用的比較少,可能是**看得少,一開始都不知道怎麼排,當時想通了原理,也就沒啥了,所謂插入,就是前面已經有序,最後插入乙個數,把這個數放在他應該放的位置就完了,比如 1 2 4 5,現在來了乙個數字a[i=4]=3,現在需要思考的問題就是如何把3放在正確的位置也就是2和4之間,首先就是大於3的數全都往後移一位,直至某個數小於3,那麼當前位置就應該是3所在的位置
**如下
void insertsort(int a,int n)
a[j+1]=temp;
}}
但是插入排序需要注意的細節比較多,首先j=i-1;而不是j=i,因為j要表示之前已將排序的陣列的最大下標,還有就是while迴圈完了之後,是a[j+1]=temp,而不是a[j]=temp,因為a[1]=2<3,所以j此時等於1,而3應該是等於a[2]才對,所以j+1
希爾排序
就是相當於有乙個步長或者跳數,講這些相隔k個數相交換,可能有10個數,第一次步長是5,那麼就是a[0]和a[5],a[1]和a[6]。。。,一趟排序之後,改變步長為3,然後a[0],a[3],a[6],a[9]相交換,。。。最後直至步長為1,這裡採取的是冒泡版的希爾排序
**如下:
void shellsort(int a,int n)
}}
希爾排序的**量比不大,可能和改進的冒泡的**來那個差不多,乙個多了乙個flag,希爾排序是設定了乙個步長,感覺理解了思想,**沒啥問題
最後總的**如下(主函式修改了隨機數的生成,原來沒有利用srand(seed),每次生成的隨機數都是一樣)
#include #include #define maxn 10
void swap(int *s,int *t)
void bubblesort(int a,int n)
} }}void bubblesort2(int a,int n)
} if(flag==0) break; }}
void selectionsort(int a,int n)
} if(j-1!=k)
swap(&a[j-1],&a[k]); }}
void insertsort(int a,int n)
a[j+1]=temp; }}
void shellsort(int a,int n) }}
void display(int a,int n){
int i;
for(i=0;i
未完待續,還有快排、堆排序、歸併排序
排序演算法二之快速 歸併排序
如果文章有什麼錯誤或者有什麼建議,歡迎提出,大家共同交流,一起進步
冒泡,快排,插入,希爾,選擇,歸併演算法
演算法,根據資料的樣子,進行做計算。爭取在固有資料的基礎上,達到計算次數 記憶體占用最少的運算方式。現將集中演算法歸納如下 演算法名稱 演算法概要 冒泡挨個拿陣列的元素和後面的做比較,發現大小不對,則交換位置,這樣導致按照座標向後運算,座標資料是一定有序的,相對後面最大或最小 快排拿乙個陣列,向前查...
冒泡 選擇 插入 希爾排序
include include include using namespace std template void print const t a,int n 氣泡排序 每次迴圈總是將最大元素移到隊尾 o n 2 穩定的排序演算法 templatevoid bubblesort t a,int n ...
排序演算法 冒泡 選擇 插入與希爾排序
思路分析 依次比較相鄰的兩個數 將比較小的數放在前面,比較大的數放在後面 第一趟比較完後,最小的數放在第一位 那麼在第二趟的時候不需要再對第一位數進行比較 依次類推,每一趟比較次數依次減小 c 實現 include using namespace std void show int arr,int ...