(一)冒泡排序、選擇排序、插入排序

最近在看數據結構與算法分析,想寫個筆記記錄一下,先從基本的冒泡、選擇、插入開始吧。

注:都是以增序爲例說明

一、冒泡排序

       1、原理:從數組的第一個位置開始兩兩比較array[index]和array[index+1],如果array[index]大於array[index+1]則交換array[index]和array[index+1]的位置,止到數組結束;

                         從數組的第一個位置開始,重複上面的動作,止到數組長度減一個位置結束;

                         從數組的第一個位置開始,重複上面的動作,止到數組長度減二個位置結束;

。。。。

2、 時間複雜度:O(N²),進行了(n-1)*(n-2)....=n*(n-1)/2次比較和約比較次數一半的交換次數(均況下),那麼根據大O表示法時間複雜度爲O(N^2)

        3、代碼

        /**
* 冒泡增序算法
* @param array
*/
public static void  bubblingSort(int[] array){
for(int i=0;i<array.length;i++){
for(int j=0;j<array.length-i-1;j++){
if(array[j]>array[j+1]){
swap(array,j,j+1);
}
}
}
}

private static void swap(int[] array,int x,int y){
int temp = array[x];
array[x] = array[y];
array[y] = temp;
}


二、選擇排序

       1、原理:選擇一個值array[0]作爲標杆,然後循環找到除這個值外最小的值(查找小於標杆的最小值),交換這兩個值,這時最小值就被放到了array[0]上,然後再將array[1]作爲標杆,從剩下未排序的值中找到最小值,並交換這兩個值。

      如圖:(數據結構與算法中的圖)

       2、時間複雜度:O(N^2),與冒泡排序相比減少了數組交換的次數

        3、代碼

         /**
* 選擇排序增序
* @param array
*/
public static void selectSort(int [] array){
for(int i=0;i<array.length;i++){
int index = i;
for(int j=i+1;j<array.length;j++){
if(array[j] < array[index]){
index = j;
}
}
if(i != index) swap(i,index,array);
display(array);
System.out.println();
}
}


public static void swap(int a,int b,int array[]){
int temp  = array[a];
array[a] = array[b];
array[b] = temp;
}

三、插入排序

1、原理:插入排序的思想是數組是部門有序的,然後將無序的部分循環插入到已有序的序列中

        如圖:(從數據結構與算法中摘得)

    

    2、時間複雜度:插入排序對隨即順序的序列的時間複雜度也爲O(N^2),但是對於基本有序的序列進行排序時間複雜度爲O(N)

    3、代碼

    /**
* 插入排序升序
* @param array
*/
public static void insertSort(int [] array){
for(int out=1;out<array.length;out++){
int temp = array[out];//被標記的值或者說是當前需要插入的值
int in = out;
//如果輪循值大於被標記值則往後移
while( in > 0 && temp < array[in - 1]){
array[in] = array[in - 1]; 
in -- ;
}
//將被標記值插入最終移出的空位置
array[in] = temp;
}
}


下次寫:希爾排序、快速排序


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章