1. 程式人生 > >經典算法學習——冒泡排序

經典算法學習——冒泡排序

const 代碼 進行 n-1 eat popu github n-2 center

冒泡排序是我們學習的第一種排序算法。應該也算是最簡單、最經常使用的排序算法了。

無論怎麽說。學會它是必定的。

今天我們就用C語言來實現該算法。

演示樣例代碼已經上傳至:https://github.com/chenyufeng1991/BubbleSort

算法描寫敘述例如以下:

(1)比較相鄰的前後兩個數據。假設前面數據大於後面的數據,就將兩個數據交換;

(2)這樣對數組的第0個數據到N-1個數據進行一次遍歷後。最大的一個數據就到了最後一個位置,也就是下標為N-1的位置(沈到了水底)。

(3)N = N-1,假設N不為0就反復(1)(2)兩步,否則排序完畢。也就是對數組的第0個數據到N-2個數據再次進行遍歷;


完整的代碼實現例如以下:

//
//  main.c
//  BubbleSort
//
//  Created by chenyufeng on 16/1/28.
//  Copyright © 2016年 chenyufengweb. All rights reserved.
//


#include <stdio.h>

typedef int BOOL;
#define true 1
#define false 0

int *bubbleSort01(int arr[],int len);
void bubbleSort03(int arr[],int len);

int main(int argc, const char * argv[]) {

    int array[7] = {150,111,1000,99,300,10,189};

    /**
     *指針向後移位;
     */

    //    int *p = bubbleSort02(array, 7);
    //
    //    for (int i = 0; i < 7; i++) {
    //        printf("%d ",*(p+i));
    //    }

    /**
     *  能夠使用傳引用的方式,實現例如以下;
     這裏不須要返回值,直接打印就可以,推薦使用這樣的方式,方便。
     */
    bubbleSort04(array, 7);
    for (int i = 0; i < 7; i++) {
        printf("%d ",array[i]);
    }

    return 0;
}

//常規的冒泡;
int *bubbleSort01(int arr[],int len){

    int temp;
    for (int i = 0; i < len; i++){
        for (int j = 1; j < len - i; j++) {
            if (arr[j - 1] > arr[j]) {

                temp = arr[j - 1];
                arr[j - 1] = arr[j];
                arr[j] = temp;
            }
        }
    }
    return arr;
}

//常規的冒泡,不須要返回值。
void bubbleSort03(int *arr,int len){

    int temp;
    for (int i = 0; i < len; i++){
        for (int j = 1; j < len - i; j++) {
            if (arr[j - 1] > arr[j]) {

                temp = arr[j - 1];
                arr[j - 1] = arr[j];
                arr[j] = temp;
            }
        }
    }
}


當然也能夠把上面的交換元素的代碼抽取出來。寫成一個交換函數swap。

代碼實現例如以下:

//
//  main.c
//  BubbleSort
//
//  Created by chenyufeng on 16/1/28.
//  Copyright © 2016年 chenyufengweb. All rights reserved.
//


#include <stdio.h>

typedef int BOOL;
#define true 1
#define false 0

int *bubbleSort01(int arr[],int len);
void swap(int *a,int *b);

int main(int argc, const char * argv[]) {

    int array[7] = {150,111,1000,99,300,10,189};

    /**
     *指針向後移位;
     */

    //    int *p = bubbleSort02(array, 7);
    //
    //    for (int i = 0; i < 7; i++) {
    //        printf("%d ",*(p+i));
    //    }

    /**
     *  能夠使用傳引用的方式。實現例如以下;
     這裏不須要返回值。直接打印就可以,推薦使用這樣的方式,方便;
     */
    bubbleSort01(array, 7);
    for (int i = 0; i < 7; i++) {
        printf("%d ",array[i]);
    }

    return 0;
}

//常規的冒泡。
int *bubbleSort01(int arr[],int len){

    int temp;
    for (int i = 0; i < len; i++){
        for (int j = 1; j < len - i; j++) {
            if (arr[j - 1] > arr[j]) {

//                temp = arr[j - 1];
//                arr[j - 1] = arr[j];
//                arr[j] = temp;

                //這裏也能夠使用swap交換函數;
                swap(&arr[j - 1], &arr[j]);
            }
        }
    }
    return arr;
}


void swap(int *a,int *b){

    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}




交換類排序:借助數據元素之間的相互交換進行排序的一種方法。如冒泡排序、高速排序。

插入類排序:將無序的各個元素依次插入到已經有序的線性表中。如直接插入排序、希爾排序。

選擇排序:掃描整個線性表,選出最小的元素。將它交換到表的最前面。然後對剩下的繼續相同的方法,直到子表為空。如直接選擇排序、堆排序。



說明下,冒泡排序的時間復雜度為O(n^2),空間復雜度為O(1).是一種穩定的排序。

技術分享


本文參考:http://blog.csdn.net/morewindows/article/details/6657829

經典算法學習——冒泡排序