交換類排序 氣泡排序(優化)和快排

2021-07-29 15:33:59 字數 3732 閱讀 7147

思想:交換類排序,兩兩交換,每趟交換完成後都會有乙個最大的被冒到後面

效能

* 時間複雜度:o(n^2)

* 空間複雜度:o(1)

* 穩定:穩定

**
//兩兩交換,每趟交換之後都會冒出乙個最大的放在後面,

void maopao(int a,int n)}}

}

例子:8,7,6,5,4

第一趟冒泡::最大值8被放到最後面

7,8

,6,5

,4--

----

--》8和7交換7,

6,8,

5,4-

----

---》8和6交換7,

6,5,

8,4-

----

---》8和5交換7,

6,5,

4,8-

----

---》8和4交換

第二趟冒泡::最大值8被放到最後面

6

,7,5,4,8--

----

--》7和6交換

6,5,7,4,8--

----

--》7和5交換

6,5,4,7,8--

----

--》7和4交換

後面的也一樣:其實就是每次從前面比較出乙個最大的放到後面,

時間複雜度:o(n2)

舉例:對於1,2,3,5,4

按照普通的冒泡

第一趟

1,2

,3,5

,4--

----

--->1和2沒有1,

2,3,

5,4-

----

---->2和3沒有1,

2,3,

5,4-

----

---->3和4沒有1,

2,3,

4,5-

----

---->4和5進行了交換//這裡已經完全有序了

第二趟

1,2

,3,4

,5--

----

--->1和2沒有1,

2,3,

4,5-

----

---->2和3沒有1,

2,3,

4,5-

----

---->3和4沒有1,

2,3,

4,5-

----

---->4和5沒有

可以看出,在已經有序的情況下,還是會按照上面的方式重新比較,即使沒有發生交換,所以這裡就有乙個優化的思路,設定乙個標誌位,每趟冒泡將其置為 true,當這一趟發生交換時把他置為 false,繼續迴圈,若一趟結束沒有發生一次交換,說明已經有序,也就是標誌位一直為 true,就可以 break 跳出迴圈

**如下

//優化後的冒泡,乙個標誌位:每一趟迴圈之前設定標記為 true,當一趟遍歷發生交換記錄將標記為改為 false,當某一趟遍歷結束還沒有發生交換時,說明已經有序,所以就不會置為 false;

void maopao1(int a,int n)

}//如果一趟冒泡之後沒有發生任何交換,說明已經有序,跳出迴圈

if (flag)

}}

演示結果

第一趟:flag 為 true

1,2

,3,5

,4--

----

--->1和2沒有1,

2,3,

5,4-

----

---->2和3沒有1,

2,3,

5,4-

----

---->3和4沒有1,

2,3,

4,5-

----

---->4和5進行了交換//flag

被置為flase

第二趟:flag 為 true

1,2,3,4,5--------->

1和2沒有

1,2,3,4,5--------->

2和3沒有

1,2,3,4,5--------->

3和4沒有

1,2,3,4,5--------->

4和5沒有//這一趟沒有發生任何交換,flag 依然為 true,就可以跳出迴圈了

**如下

//優化的冒泡,設定乙個下表記錄上次最後一次發生交換的位置,該位置前面的沒有發生交換,說明已經有序,那麼下次就可以縮小範圍,最他後面的進行排序

void maopao2(int a,int n)

}if (lspt == lsp)

}}

演示如下

第一趟

5,7

,1,4

,2,3

----

--->2和3沒有交換5,

7,1,

2,4,

3---

---->2和4發生交換,當前的

j是4,所以本次交換的位置為45,

7,1,

2,4,

3---

----

->1和

2沒有交換5,

1,7,

2,4,

3---

----

->1和7發生了交換:當前

j是2,所以本次交換的位置為21,

5,7,

2,4,

3---

----

->1和5發生了交換,當前

j是1,所以本次交換的位置為1

第一趟結束以後,最後一次發生交換的位置為1,之前的沒有再發生交換,說明已經有序,那麼下一趟要排序的範圍就縮小到1~n,而不是0~n

第二趟

1,5

,7,2

,3,4

----

----

->4和3交換,當前

j是5,所以本次交換的位置為5;1,

5,7,

2,3,

4---

----

--->2和3沒有交換1,

5,2,

7,3,

4---

----

--->7和2發生了交換,當前

j是3,所以本次交換的位置為31,

2,5,

7,3,

4---

----

--->5和2發生了交換,所以當前位置為2,所以本次交換的位置為2

第二趟結束後,最終交換位置為2,說明2號位置前面已經有序,下次縮小範圍 2~n 就可。

思想:

效能 **

*/

void quicksort(int a,int l,int r)

if (ia[i++] = a[j];

}//從前往後找找比key大的

while (ia[i];

}if (ia[j--] = a[i];}}

a[i] = key;

quicksort(a, l, i-1);

quicksort(a, i+1, r);

}}

優化

* 隨機產生key

* 三數取中:左邊、右邊、中間取乙個值在中間的作為key

氣泡排序和快排

1.氣泡排序 氣泡排序要點 1 兩層迴圈,外層迴圈控制走訪數列重複進行的次數,內層迴圈進行資料的比較 交換,是資料 上浮 2 內層迴圈是相鄰的資料進行比較。var bubblesort function arr console.log arr 1,1,2,3,4,6,7,8 bubblesort 1...

php氣泡排序和快排

function bubble sort array for i 0 i count i return array function quick sort array rightarr array leftarr array key array 0 for i 1 i count i else le...

排序演算法之交換(冒泡與快排)

排序演算法根據是否需要訪問外存,分為內部排序和外部排序。使用記憶體,分為插入 直接插入排序 希爾排序 選擇 簡單選擇排序 堆排序 交換 氣泡排序 快速排序 歸併 基數。5.氣泡排序 效率很低,實現簡單 待排序列 3 1 4 2 第一趟排序結果 1 3 2 4 第二趟排序結果 1 2 3 4 第三趟排...