聽名字還挺可愛的,冒泡(●』◡』●)。
為啥叫冒泡呢?
對n個元素進行排序,進行n-1次迴圈。
在對第k次迴圈中,對前n-k個元素從前往後進行比較,每次比較相鄰的兩個元素,若前乙個元素大於後乙個元素,就交換,否則保持位置不變(就是實現了把前n-k個中最大放到了最後)。
所以每次排序一定能保證當前第k大的回落到第n-k個位置,稱為第k趟的冒泡。
**:
void bubblesort(int a,int n)
flag=true; //如果有交換就標記
}if(!flag) break;
}}
將未排序元素根據基準分為兩個子串行,其中乙個子串行的記錄均大於基準,而另乙個子串行均小於基準,然後遞迴的對兩個子串行用類似的方法進行排序。
本質上,快速排序使用的是分治法,將問題的規模減小一半左右,然後再分別進行處理。(看不懂沒關係,看下面的流程)
對於一趟基準調整的過程:
①:選擇乙個基準,並與最後乙個元素進行交換;
②:設定兩個指標low和high,初值(這個「初值」講的很妙啊,指標嘛,存的是位址啊)分別指向第一、倒數第二個元素;
③:重要: 先low從左往右(順序)掃瞄,如果遇到比基準(此時在陣列最後位置)大,stop;high指向的位置開始從右往左(倒序),如果遇到比基準小,stop;
④:這是第③步結果的執行:1.如果high和low沒有錯位(high>low),high和low指向的元素互換位置;
⑤:重複③④兩步,直到high和low錯位,然後基準和陣列元素a[low]交換。
可以看到,low和high執行過程中,low位置之前的元素一定比基準小,high位置之後的元素一定比基準大,這樣就完成了一次劃分,分成了小於和大於基準的兩個子串行。
⑥:遞迴地對兩個子串行用同樣的方法進行快速排序演算法流程。
感覺是可以隨便拿幾個數模擬一下一趟快速排序,快速排序演算法也達到了分而治之的演算法目的。
**:
void swap(int *a,int *b)
void qsort(int a, int low, int high)//對low到high區間內進行一趟快速排序
swap(&a[low],&a[right]);//把基準放到正確的位置。
//遞迴對兩個子串行進行快速排序
qsort(a,left,low-1);
qsort(a,low+1,right);
}void quicksort(int a, int n)
時間複雜度:最好的情況下,每次劃分都劃分成兩個基本等長的序列,那麼遞迴層次(即深度)是o(logn),每一次遞迴層次上的比較總次數都是o(n),所以最好時間複雜度是o(nlogn)。但是如果每次劃分都是1和n-1,則快速排序的執行時間就會接近於氣泡排序,可能導致o(n^2)的時間效率。
基準:在a[low],a[high],a[(low+high)/2]三個的中值作為基準,這樣有可能避免時間複雜度出現的最壞情況。
快速排序是不穩定的。
歸併排序是建立在歸併操作上的一種排序方法。
歸併操作是將兩個已經排列好的序列合併成乙個有序序列的過程。
把長度為n的序列看成n個長度為1的字序列,接下來就是把相鄰兩個字序列合併,形成[n/2]個長度為2的有序字序列;然後繼續合併兩兩歸併,如此一直下去直到剩下乙個長度為n的序列。
原理非常簡單易懂,直接進行**實現吧。
void merge(int a,int temp,int left,int mid,int right)
void msort(int a,int temp,int left,int right)
}void mergesort(int a,int n)
時間複雜度:進行o(logn)次遞迴,每次遞迴有n次比較,所以是o(nlogn)的;
空間複雜度:o(n);
穩定的排序演算法。
我的筆記之交換排序
演算法思想 效率及穩定性 適用場景 示例 private static void sort int a if tag 複製 演算法思想 效率及穩定性 適用場景 遞迴出口,條件為 low high 給指標i j和基準值key賦值 完成一趟排序,迴圈條件為 i j 迴圈內部,從右往左找小於等於key的值...
排序專題之交換排序
在交換排序這一類中,分為氣泡排序和快速排序,快速排序是建立在 氣泡排序基礎上的乙個優化,很有意義的乙個排序,在各種acm競賽 以及其他領域中經常被用到 接下來,我們先看一看氣泡排序。氣泡排序基本思想 通過無序區中相鄰記錄關鍵字間的比較和位置的交換,使關鍵字最小的記錄如氣泡一般逐漸往上 漂浮 直至 水...
排序演算法之交換排序
交換排基本思想 兩兩比較待排序元素的關鍵字,發現兩個元素的次序相反時即進行交換,知道沒有反序的元素為止。本節介紹兩種交換排序,即氣泡排序和快速排序。氣泡排序 每次只能和相鄰的位置數進行交換,效率低 include int a 100 void quicksort int left,int right...