1. 程式人生 > >排序演算法之氣泡排序及其優化

排序演算法之氣泡排序及其優化

定義:每一趟都是相鄰兩個元素進行比較,將小數放在前面,大數放在後面,最終一趟走完,最大的數也就跑到最後面了。

氣泡排序是常見的一種排序方法,比較簡單,容易理解,多用於教學(>﹏<)

最壞情況下時間複雜度:O(N^2) 。
比較次數是n(n-1)/2。

注意兩者是不同的概念,為了便於理解,我再囉嗦幾句。
對於最壞的情況下,是將順序的資料變成逆序,或者將逆序的資料變成順序,這樣的情況每次的比較都要進行交換。舉例來說,比如一組資料5,4,3,2,1進行升序的排列。

第一次大迴圈結果:4,3,2,1,5 中間經歷了4次比較。

……

第四次大迴圈結束:1,2,3,4,5經歷了1次比較。

所以總的比較次數為:4+3+2+1=10。

而對於n的數列來說:(n-1)+(n-2)+(n-3)+….+1 = n*(n-1)/2,得到最大的比較次數。

按照複雜度的計算規則,去掉常數,去掉最高項係數,其時間複雜度也就為O(N^2) 。(可能有些不知道複雜度是如何計算的,為何要去掉常數和係數。假設n=10000,那麼10000*(10000-1)/2,現對於10^8來說10000就顯得微乎其微了,對於係數我們也不要用關心,因為n^2,在這裡也就是10^8才是決定整個表示式的關鍵因素。)

程式碼例項:

public static void main(String[] args) {
    int[] arr = { 5, 4, 3, 6, 8, 9 };
    bubbleSort1(arr);
    System.out
.println(Arrays.toString(arr)); } static void bubbleSort1(int[] arr) { int temp = 0; for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length - i - 1; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1
]; arr[j + 1] = temp; } } } }

優化

思路:當我們發現第一次外迴圈結束後,資料已經變得有序了後,就沒有必要再進行迴圈了,因為此時只有比較沒有交換了。那麼第二遍迴圈沒有交換,勢必不會進入if語句。如果不好理解,我們可以假設一組數列。

2,1,3,4,5

第一遍迴圈後數列變成1,2,3,4,5.

這時接下去的迴圈就沒有必要了,這樣的話,我們可以用一個識別符號,來記錄是否發生了交換,你可以用boolean,也可以用整形數值,這裡只作為一個標誌位。

程式碼:

public static void main(String[] args) {
    int[] arr = { 5, 4, 3, 6, 8, 9 };
    bubbleSort2(arr);
    System.out.println(Arrays.toString(arr));
}

static void bubbleSort2(int[] arr) {
    int temp = 0;
    boolean flag ;
    for (int i = 0; i < arr.length - 1; i++) {
        flag = true; //若不進入內層迴圈的if,flag為true,證明此時數列已經有序。
        for (int j = 0; j < arr.length - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                flag = false;
            }
        }
        if(flag)
            break;
    }
}

總結:

按照改進的演算法,對於一個已經有序的數列,演算法完成第一次外層迴圈後就會返回,實際上只發生了n-1次比較,所以,最優的情況下,該演算法的時間複雜度為O(N)

相關推薦

排序演算法氣泡排序及其優化

定義:每一趟都是相鄰兩個元素進行比較,將小數放在前面,大數放在後面,最終一趟走完,最大的數也就跑到最後面了。 氣泡排序是常見的一種排序方法,比較簡單,容易理解,多用於教學(>﹏<) 最壞情況下時間複雜度:O(N^2) 。 比較次數是n(n-1)/2。 注

排序演算法 氣泡排序 及其時間複雜度和空間複雜度

        氣泡排序(Bubble Sort),是一種電腦科學領域的較簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因

c#程式碼實現排序演算法氣泡排序

氣泡排序的平均時間複雜度為O(n²),最好時間複雜度為O(n),最壞時間複雜度為O(n²),空間複雜度為O(1),是一種穩定的演算法。 1.將整個待排序的記錄序列劃分成有序區和無序區,初始時有序區為空,無序區包括所有待排序的記錄。 2.對無序區從前向後依次比較相鄰記錄,若反序則交

排序演算法氣泡排序(關鍵詞:資料結構/演算法/排序演算法/氣泡排序

假定:有 1 個亂序的數列 nums ,其中有 n 個數。 要求:排好序之後是 從小到大 的順序。 氣泡排序演算法 程式碼 from swap import swap def bubble_sort(nums): n = len(nums) for i in rang

排序演算法氣泡排序【java實現】

氣泡排序介紹 基本思想就是相鄰資料交換,每次將最大或最小的數進行移動。 步驟:(1)對陣列中的各資料,依次比較相鄰的兩個元素的大小。            (2)如果前面的資料大於(小於)後面的資料,就交換這兩個資料。經過第一輪

排序演算法氣泡排序——2種形式

1.第一種形式氣泡排序 package Sort; public class BubbleSort1 {     public static void main(String[] args) {      &nbs

排序演算法氣泡排序改進演算法

前言 排序演算法中最最常見也算是入門的一個排序演算法就是氣泡排序。這篇文章我們就來好好地寫寫這個氣泡排序演算法,以及氣泡排序呢的改進演算法。 傳統冒泡演算法 static int[] array = {100,1,5,4,11,2,20,18,89,34,20,34}; @Test publ

Java排序演算法——氣泡排序,插入排序,選擇排序

<1>氣泡排序 這個名詞的還是很形象的,就是每次比較相鄰的兩個數,大的數總是往後面冒,所以每輪比較結束後,大數都會冒到最後面。 每次比較的結果如下: 無序陣列  :8 2 4 3 5 7 1 9 6 (後面所有的排序都將使用這個陣列) 第一輪比較:2 4 3 5

陣列排序演算法氣泡排序

一、基本思想 氣泡排序的基本思想就是對比相鄰的元素值,如果滿足條件就交換元素值,把較小的元素移動到陣列的前面,把大的元素移動到陣列後面(也就是交換兩個元素的位置),這樣較小的元素就像氣泡一樣從底部上升

排序演算法----氣泡排序,插入排序,選擇排序

1 氣泡排序 顧名思義:小的數一點一點向前冒,最終有序 public static void bubbleSort(int[] arr){ if(arr == null || arr.length <2){ return; } for(int i

排序演算法氣泡排序

氣泡排序 顧名思義,氣泡排序直觀的意思是氣泡越大冒的越快:),對應到我們的列表中就是數字最大的先選出來,然後依次進行。例如 myList = [1,4,5,0,6],比較方式為: 相鄰的兩個數字先進行比較,也就是myList[0]和myList[1],發現不是"

Java經典排序演算法氣泡排序(Bubble sort)

原理: 比較兩個相鄰的數,將大值交換到右邊,依次進行比較,直到排序完成圖解:以上圖片來源於百度Java實現:      /** * java實現氣泡排序 */ private static int[] arrays={2,16,8,32,64,10

排序演算法氣泡排序的思想以及Java實現

1 基本思想 設排序表長為n,從後向前或者從前向後兩兩比較相鄰元素的值,如果兩者的相對次序不對(A[i-1] > A[i]),則交換它們,其結果是將最小的元素交換到待排序序列的第一個位置,我們

php排序演算法氣泡排序

目錄 一: 原理 二: 舉例說明 三: PHP程式碼實現氣泡排序 一: 原理 對一組資料,比較相鄰資料的大小,將值小資料在前面,值大的資料放在後面。   (以下都是升序排列,即從小到大排列) 二: 舉例說明 $arr = array(6, 3, 8, 2

常見排序演算法氣泡排序

常見排序演算法之氣泡排序 氣泡排序(Bubble Sort),是一種較簡單的排序演算法。它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果他們的順序(如從小到大、首字母從A到Z)錯誤就把他們交換過來。 氣泡排序演算法的運作如下: 比較相鄰的元素。

Java排序演算法氣泡排序和選擇排序

import java.util.Arrays; class Demo { public static void main(String[] args) { int

Java實現排序演算法氣泡排序

氣泡排序的思想:將帶排序的序列兩兩進行比較,較大的一個“冒泡”,“冒泡”即如果下標為A 與B的資料比較,A 大則與B交換位置,否則就不交換位置,交換位置後,此時B的位置程式設計A,B 的下一個位置是B,兩者在進行比較,每進行一輪排序,總是較大的數排在剩下序列的最高位,也因此為

演算法排序演算法氣泡排序

排序算法系列目錄說明 氣泡排序(Bubble Sort) 插入排序(Insertion Sort) 希爾排序(Shell Sort) 選擇排序(Selection Sort) 快速排序(Quick Sort) 歸併排序(Merge Sort) 堆排序(Heap

排序演算法氣泡排序和快速排序(Java版)

轉自:http://www.cnblogs.com/0201zcr/p/4763806.html  作者:Whywin 1、氣泡排序 演算法如下(排序後,由小到大排列): /** * 氣泡排序 * 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。

js排序演算法氣泡排序

//功能:氣泡排序 //引數:arr, 待排序陣列 //返回:arr1,排序後陣列 function bubbleSort(arr) { var len = arr.length;