1. 程式人生 > >演算法分析之冒泡,快速,選擇排序

演算法分析之冒泡,快速,選擇排序

一:排序

1.氣泡排序:其基本原理是相鄰的兩個數進行比較

 public class BubbleSort {

    public void bubbleSort(int[] arr) {

        int temp;

        int sum = 0;

        for (int i = 0; i < arr.length; i++) {

            for (int j = arr.length - 1; j >i; --j) {

                if (arr[j - 1] > arr[j]) {//冒泡的核心:相鄰的進行比較,而不是外層元素依次和內層元素比較

,倒敘和升序也在這裡控制

                    temp = arr[j];

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

                    arr[j - 1] = temp;

                }

            }

            sum++;//檢視外層迴圈進行的次數

        }

        System.out.println(sum);

        for (int m = 0; m < arr.length; m++) {

            System.out

.println(arr[m]);

        }

    }

    public static void main(String[] args) {

        int[] arr =new int[] { 3, 55, 66, 43, 63, 24,32, 44, 23, 534, 532, 64 };

        newBubbleSort().bubbleSort(arr);

    }

}

時間複雜度為O(N^2) (比較次數N*N/2,交換N*N/4)這個怎麼算的?;

適用於n比較小的情況

2.選擇排序

   基本原理是選取要比較的數依次與後面的數進行比較,先把要比較數做一個標記

A,把滿足條件的那一位進行標記B,迴圈比較一次結束以後將標記為A的數的位置與標記為B的位置的數進行替換。如果沒有就和本身進行替換

public classSelectionSort {

    public void selectSort(int [] intArr){

        int max,in,out,temp;

        for(out=0;out<intArr.length;out++){//控制迴圈的次數

           max = out;//把要進行比較的數進行標記A

           for(in=out+1;in<intArr.length;in++){

               if(intArr[max]<intArr[in]){//如果小於則將標記交換

                  max = in;//內層迴圈結束後,這裡是標記B

               }

           }

           temp = intArr[out];//下面三步是將兩個標記的數進行交換

           intArr[out]= intArr[max];

           intArr[max] = temp;

        }

        for(int x :intArr){

            System.out.print(x+":");

        }  

    }

    public static void main(String[] args) {

        //int intArr[] =new int[]{13,2,34,132,432,34,53,13,56,34,224,1344,554,22344,23453,3,555,666,223};

        int intArr[] =new int[]{4,3,2,1};

        newSelectionSort().selectSort(intArr);

    }

}

時間複雜度:O(N*N),比較N*N/2,交換<N;與冒泡相比,比較次數沒有明顯改變,但交換次數明顯減少許多。

適用於n比較小的情況

3.插入排序(適用於部分資料已經排好序的情況)

  核心思想是:依次取出要排序的那個數字分別與排好序的資料進行依次比較,找到那個滿足條件的數的前一個停止比較,進行插入,。

時間複雜度:O(n^2) ,比較N*N/4,複製N*N/4;插入排序在隨機數的情況下比冒泡快一倍,比選擇稍快;在基本有序的數字中,插入幾乎只需O(N);在逆序的情

//況下,不必冒泡快。

package com.yxyt.sort;

public class InsertSort {

    /**

     * 插入排序

     */

    public void insertSort(int[] arr) {

        int j, temp;

        for (int i = 0; i < arr.length; i++) {

            j = i - 1;//因為每次都是和他本身前一個比較。

            temp = arr[i];

            for (; j >=0; j--) {

                if (temp < arr[j]) {

                    arr[j + 1] = arr[j];不符合條件依次向後移

                } else {

                    break;//找到滿足條件退出比較

                }

            }

            arr[j + 1] = temp;

        }

        for (int x : arr) {

            System.out.print(x +"!");

        }

    }

    public static void main(String[] args) {

        int intArr[] =new int[] { 13, 2, 34, 132, 432,34, 53, 13, 56, 34,

                224, 1344, 554, 22344,23453, 3, 555, 666, 223 };

        // int intArr[] =new int[]{4,3,2,1};

        newInsertSort().insertSort(intArr);

    }

}