1. 程式人生 > >八大內部排序演算法(上)-冒泡、直接插入、簡單選擇、快速

八大內部排序演算法(上)-冒泡、直接插入、簡單選擇、快速

八大內部排序演算法(上)冒泡、直接插入、簡單選擇、快速 排序分為內部排序和外部排序,內部排序是資料記錄在記憶體中進行排序,而外部排序是因排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。

我們這裡說說八大排序就是內部排序。


1.直接插入排序

將一個記錄插入到已排序好的有序表中,從而得到一個新,記錄數增1的有序表。即:先將序列的第1個記錄看成是一個有序的子序列,然後從第2個記錄逐個進行插入,直至整個序列有序為止。

要點:設立哨兵,作為臨時儲存和判斷陣列邊界之用。

直接插入實現如下:

        /*
	 * 1.插入排序
	 * 思想:每遍歷一次,都把陣列中下表為當前遍歷次數的數字插入到已經排好的順序當中去
	 * 插入排序中,總是先尋找插入位置,然後在實行挪動和插入過程;尋找插入位置採用順序查詢的方式(從前向後或者從後向前),
	 * 既然需要插入的陣列已經是有序的,那麼可以採用二分查詢方法來尋找插入位置,提高演算法效率,但演算法的時間複雜度仍為O(n2)。
	 */
	public void insertSort(Integer []array){
		int size=array.length;
		int temp;
		System.out.println("插入排序結果:");
		for(int i=1;i<size;i++){
			if(array[i]<array[i-1]){
				for(int j=i;j>0;j--){
					if(array[j]<array[j-1]){
						temp = array[j-1];
						array[j-1] = array[j];
						array[j] = temp;
					}
				}
				//=========輸出排序詳情
				System.out.print("第" + (i) +"次:");
				for (int j = 0; j < array.length; j++) {
					System.out.print(array[j] + " ");
				}
				System.out.println();
			}
		}
	}
2.簡單選擇排序 在要排序的一組數中,選出最小(或者最大)的個數與第1個位置的數交換;然後在剩下的數當中再找最小(或者最大)的與第2個位置的數交換,依次類推,直到第n-1個元素(倒數第二個數)和第n個元素(最後個數)比較為止。具體實現如下
/*
	 * 2.簡單選擇排序
	 * 思想:遍歷陣列剩餘數字,每次選擇最小的一個數和當前的遍歷次數位置數字替換
	 */
	public void choiceSort(Integer []array){
		int size=array.length;
		System.out.println("\n選擇排序:");
		for (int i = 0; i < size; i++) {
			int temp = array[i],min=i;
			for (int j = size-1; j >=i; j--) {
				if(array[j] <temp){
					temp = array[j];
					min=j;
				}
			}
			if(min!=i){
				array[min]=array[i];
				array[i]=temp;
			}
			//=========輸出排序詳情
			System.out.print("第" + (i+1) +"次:");
			for (int j = 0; j < array.length; j++) {
				System.out.print(array[j] + " ");
			}
			System.out.println();
		}
	}

3.氣泡排序 在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。
    //3.氣泡排序  
    public void Bubble_Sort(Integer []array){  
        int size = array.length;  
        int tmp;  
        System.out.println("氣泡排序結果:");  
        for(int i=0;i<size;i++){  
            for(int j=size-1;j>i;j--){  
                if(array[j]<array[j-1]){  
                    tmp=array[j-1];  
                    array[j-1]=array[j];  
                    array[j]=tmp;  
                }  
            }  
            //=========輸出排序詳情  
            System.out.print("第" + (i+1) +"次:");  
            for (int j = 0; j < array.length; j++) {  
                System.out.print(array[j] + " ");  
            }  
            System.out.println();  
        }  
    }

4.快速排序

基本思想:

1)選擇一個基準元素,通常選擇第一個元素或者最後一個元素,

2)通過一趟排序講待排序的記錄分割成獨立的兩部分,其中一部分記錄的元素值均比基準元素值小。另一部分記錄的 元素值比基準值大。

3)此時基準元素在其排好序後的正確位置

4)然後分別對這兩部分記錄用同樣的方法繼續進行排序,直到整個序列有序。

具體實現如下:
    /* 
     * 4.快速排序 
     */  
    public void QuickSort(Integer []array, int low, int high){  
        int i=low,j=high;  
        if(i<j){  
            int po = array[low];  
            while(i<j){  
                while(i<j && po<array[j]){  
                    j--;  
                }  
                if(i<j){  
                    int temp = array[i];  
                    array[i] = array[j];  
                    array[j] = temp;  
                    i++;  
                }  
                while(i<j && po>array[i]){  
                    i++;  
                }  
                if(i<j){  
                    int temp = array[i];  
                    array[i] = array[j];  
                    array[j] = temp;  
                    j--;  
                }  
            }  
            QuickSort(array,low,j-1);  
            QuickSort(array,j+1,high);  
        }  
    }

測試:
package com.devin.sequence;
/** 
 *
 * @JavaTest
 * @author  ldw 
 * @date    建立時間:2015年4月14日 下午3:19:35 
 * @version 2015年4月14日  
 *
 */
public class Test {
	
	public static void main(String[] args) {
		Integer [] array = {1,33,3,14,5,71,6,88};
		
		Test t = new Test();
		//t.Bubble_Sort(array);
		System.out.println();
//		t.insertSort(array);
		//t.choiceSort(array);
		//快速排序
		t.QuickSort(array, 0, array.length-1);
		System.out.println();
		for (int j2 = 0; j2 < array.length; j2++) {
			System.err.print (array[j2]+" ");
		}
	}
}