思想:交換類排序,兩兩交換,每趟交換完成後都會有乙個最大的被冒到後面
效能
* 時間複雜度: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 第三趟排...