在上一期我們學習了插入類排序的演算法後,知道了排序的一些基本的原理。然而實際上排序除了插入類排序以外,還有很多種類的排序演算法值得去學。比如,交換類排序,選擇類排序,歸併類排序還有基數類排序。而今天的交換類排序就有兩種演算法,它們分別是氣泡排序和快速排序。
氣泡排序其實就是通過一系列的交換動作來達到排序的目的。打個比方,假如現在有兩個元素,分別是a和b。a比b大,那麼我們就要讓a排到b的後面。這個時候我們可以定義乙個新的變數來儲存a的值,比如說我定義temp儲存a的值,然後把b的值給a。這個時候a和b一樣。由於剛剛a的值給了temp,所以我們現在把temp的值給b,那麼這就實現了兩個元素的交換了~
void
bubblesort
(int arr,
int n)
}//一趟排序過程中沒有發生關鍵字的交換,那麼就說明有序,則跳出
if(flag ==0)
}}
時間複雜度
在最壞的情況下,當這個待排序的序列是逆序的,那麼對於外層迴圈的每次執行,內層迴圈中的 if 語句就會一直成立,所以基本的操作執行次數就是 n - i。基本操作的總執行次數就是 ( n - 1 + 1 ) ( n - 1 ) / 2 = n ( n - 1 ) / 2。所以這個時間複雜度就是 o ( n² )
那最好的情況呢?肯定就是這個序列全部都是有序的,那麼內層迴圈的 if 就一直不成立。 基本上執行 n - 1 次後就會結束整個演算法。 時間複雜度就是 o ( n )
空間複雜度
剛剛的額外輔助空間只有乙個temp,所以說空間複雜度就是 o ( 1 ) 了
快速排序也是交換類排序,它是通過多次劃分實現操作的排序。就拿公升序舉例子,這個執行流程基本可以概括為每一趟選擇當前所有子串行中的乙個元素作為樞軸,把子序列中比樞軸小的移到樞軸前邊,然後比它大的移動到後邊。等本趟所有子串行都被樞軸以剛剛的規則劃分完成以後就會得到新的一組比較短的子串行,然後就會稱為下一趟劃分的初始序列集。
void
quickesort
(int arr,
int left,
int right)
if(i < j)
//從左往右,找到大於temp的元素
while
(i < j && arr[i]
< temp)
if(i < j)
}//把temp放在最後的位置
arr[i]
= temp;
//遞迴對左邊排序
quickesort
(arr, left, i -1)
;//遞迴對右邊
quickesort
(arr, i +
1, right);}
}
時間複雜度
在最壞的情況下時間複雜度是o ( n² ),因為這個演算法越接近有序,效率越低。那麼最好的情況呢,就是o( nlog2n ),這個演算法越接近無序,效率反而越高。平均下來,就是o( nlog2n )。
空間複雜度
這個演算法的空間複雜度是 o ( log2n ),因為剛剛用了遞迴,而遞迴則需要棧的輔助。所以它需要的輔助空間自然就比較大。
排序演算法 交換類排序
今天我們討論一下交換類排序。交換排序的演算法思想 通過交換逆序的元素實現交換排序。交換排序主要有兩種 一種是氣泡排序,一種是快速排序。演算法思想 氣泡排序是一種簡單的交換類排序演算法,它是通過交換相鄰兩個資料元素,逐步將排序序列變成有序序列。基本演算法思想描述如下 假設待排序元素有n個,從第乙個元素...
排序演算法之交換類排序
交換類排序的思想,顧名思義,就是在每一輪的排序過程,通過不斷的交換來使每個元素到達最終的位置。常見的兩種交換類排序有氣泡排序和快速排序。氣泡排序作為最基礎的排序演算法,它的排序思想也如其名,通過比較兩個相鄰資料的大小,來決定是否交換它們的位置,最後經過多輪排序最終是整個序列有序。網上找到的gif 分...
排序 交換類排序
演算法思想 陣列中第乙個元素和第二個元素比較,按照規則進行交換,再讓第二個和第三個進行比較,直到最大或最小的那個數交換到最後,一趟氣泡排序完成。以公升序為例,氣泡排序主要是讓大的下沉,小的上浮,每一趟排序確立乙個當前無序序列中最大的那個數,使之下沉。時間複雜度分析 最壞 整個陣列逆序,最內層迴圈的語...