選擇排序、插入排序、希爾排序總結

本來昨天想寫最小生成樹的kruskal算法,但是其中需要將圖的邊集數組進行排序,要用到排序算法,所以暫時先將kruskal算法放一下,把排序算法好好複習和總結一遍

以下的排序結果默認爲非遞減

1、選擇排序

選擇排序的思想:從第i個元素開始(i=1,i++),遍歷一遍數組,找出數組中的最小值,然後與第i個元素交換位置,i++,不斷的循環下去直到i>數組長度(長度爲length-1,第0個元素習慣用作哨兵位)


看看具體算法

public void selectSort(int arc[]){
		
		int min;
		for(int j=1;j<arc.length;j++){
			min = j;
			for(int i=j+1;i<arc.length;i++){
				if(arc[i]<arc[min])
					min = i;				
			}
			each(arc,j,min);  //交換arc[j]和arc[min]的位置
			System.out.println(arc[j]); 
		}
		
	}

選擇排序的幾個特點:

1.時間複雜度爲O(n^2)

2.運行的時間與輸入參數的初始狀態無關,因爲每一次的遍歷都不會爲下一次提供任何有用的信息;

3.數據的移動是最少的。



2、插入排序

插入排序的思想:將第i個元素與i-1的元素比較,如果第i個元素較小,則把其插入到arc[0]的哨兵位,然後比哨兵位大的元素不斷的往後移動一位,最後將哨兵位的元素插入到最後移動的那個位置。注:i一般從2開始,因爲假設第1位已經排好序了。

看看具體算法


public void insertSort(int arc[]){
		int i;
		for(int j=2;j<arc.length;j++){
			if(arc[j]<arc[j-1]){
				arc[0] = arc[j];	 //插入哨兵位
				for(i=j-1;arc[i]>arc[0];i--){
					arc[i+1] = arc[i];      //元素不斷向後移動一位
				}
				arc[i+1] = arc[0];	//將哨兵位的元素插入到最後一次移動的位置			
			}
		}
		output(arc);             //輸出排好序的數組元素
	}

output(int arc[])具體代碼

private void output(int[] arc) {
		for(int i=1;i<arc.length;i++){
			System.out.println(arc[i]);
		}
		
	}

插入排序的幾個特點:

1.時間複雜度爲O(n^2),但插入排序平均速度要比選擇排序快;

2.運行時間與輸入的參數初始化狀態有關,比如對於部分有序的數組十分高效;


3、希爾排序


希爾排序思想:希爾排序是簡單的改進了插入排序,交換不相鄰的元素以進行局部的排序,並最終用插入排序對局部的數組排序。


看看具體代碼

public void shellSort(int arc[]){
		int i;
		int increment = arc.length/3+1;   //增量序列
		while(increment>0){
			for(int j=1+increment;j<arc.length;j++){
				if(arc[j]<arc[j-increment]){
					arc[0] = arc[j];
					for(i=j-increment;i>0&&arc[i]>arc[0];i-=increment){//i>0是表示當要插到第1位時的條件,且i>0一定要在邏輯運算中的前面
						arc[i+increment] = arc[i];              //否則會ArrayIndexOutOfBoundsException
					}
					arc[i+increment] = arc[0];
				}
			}
			increment/=3;
		}	
		output(arc);             //輸出排好序的數組元素		
	}

希爾排序的幾個特點:

1.時間複雜度爲O(n^3/2)

2.對於較大的數組,希爾排序的速度相較於插入排序的優勢更加明顯



總結

雖然選擇排序和插入排序的時間複雜度一樣,但是選擇排序的運行時間和參數的初始狀態無關,只要數組參數的長度一樣,不管數組裏面的元素初始排序是怎樣的,運行時間都不會有改變(默認理想環境,忽略硬件環境造成的誤差)。而插入排序的運行時間和參數初始狀態有關,特別是對於部分有序數組,十分高效,因此插入排序比選擇排序的平均運行時間要快一些。

希爾排序是對插入排序的改進,對距離increment的元素進行比較和交換,元素的跳躍跨度較大,使得希爾排序在較大的數組中的運行時間要比插入排序短。




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