排序 交換排序

2021-08-19 07:25:41 字數 1673 閱讀 2749

交換排序:利用交換位置進行排序

1、演算法思想

重複的走訪要排序的元素,依次比較相鄰兩個元素的大小,如果順序錯誤則交換這兩個元素的位置,直到不需要在比較

2、步驟

比較相鄰兩個元素,如果前乙個比後乙個大,則交換位置

從第乙個元素一直比較到最後乙個元素,這時最後乙個元素的值是最大的

減掉最後乙個元素,重複上述步驟

每次比較的元素個數逐漸減少,直到沒有要比較的元素

程式**:

void buttorsort(int *array, int size)//氣泡排序

最好情況下的時間複雜度:o(n)

最壞情況下的時間複雜度:o(n^2)

空間複雜度:o(1)

穩定性:穩定的

適用場景:

(1)資料量大

(2)資料隨機

方法一——基準值

演算法描述:取第乙個或最後乙個元素為基準值;然後使標記left指向起始位置、right指向最後乙個位置;讓right從後往前走直至遇到比基準值小的時候才停下來,left從前往後走直至遇到比基準值大的時候停下來;然後交換arr[left]和arr[right]的值;重複上述步驟直至left>=right;然後交換基準值與當前停下來的位置的值。這個時候就以基準值為基礎將陣列分為兩個部分,基準值左邊的都小於基準值、基準值右邊的都大於基準值。最後遞迴處理每部分。

步驟:

4 int pation(int *arr,int left,int right)

5 16 swap(arr[left],arr[key]);

17 18 return left;

19 }

20 void quicksort(int *array,int left,int right)

21 28 }

方法二——挖坑法

演算法描述:首先取首元素或最後乙個元素為基準值key,讓key=arr[0],這時候相當於第乙個元素被挖走了,這裡就成了乙個坑;此時讓right從後往前走找比key小的元素填到arr[0]這裡,這時arr[right]這裡又相當於是乙個被挖走的坑;此時讓left從前往後走找比key大的元素填到arr[right]。然後讓right繼續從後往前找填上乙個坑,以此類推;直到left==right,此時此處必定是乙個坑,將key的值填進去。這個時候就將整個陣列分為兩部分。最後遞迴呼叫。

快速排序的優化——三數取中

在陣列中找三個數並取其中的中間值作為基準值

7 int mid(int *arr,int left,int right)

8 18 int pation(int *arr,int left,int right)

19 30 swap(arr[left],arr[key]);

31 32 return left;

33 }

交換排序 快速排序

快速排序 quick sort 也是一種交換排序,它在排序中採取了分治策略。從待排序列中選取一元素作為軸值 也叫主元 將序列中的剩餘元素以該軸值為基準,分為左右兩部分。左部分元素不大於軸值,右部分元素不小於軸值。軸值最終位於兩部分的分割處。對左右兩部分重複進行這樣的分割,直至無可分割。從快速排序的演...

交換排序 氣泡排序

交換排序 兩兩比較待排序記錄的關鍵碼,若是逆序,則交換,直到無逆序。其中最簡單的交換排序是 氣泡排序。氣泡排序 bubble sort,也叫起泡排序 不斷地比較相鄰的記錄,若是不滿足排序要求,則交換。交換時,可從前向後,也可從後向前。看乙個從前向後的排序過程 原序列 12 3 45 33 6 下標 ...

氣泡排序 交換排序

最壞情況下,直接插入排序時間複雜度為 n 最小時間代價為 n 平均時間代價為 n 附加儲存空間 乙個儲存單位 穩定性 穩定 原址性 是 緊緻性 乙個比較,三個賦值操作 特點 對於基本有序,或偶爾有幾個在有序位置附近時,效率高,只有直接插入排序和它達到一樣的效果 整體效果不如直接插入排序,因為,直接插...