深入理解各種排序


排序算法是很多公司面試或者筆試時候的必出題,也是會在自己今後道路上解決排序問題的重中之重。很多人在畢業後由於不怎麼接觸算法可能都忘記了。今天抽了點時間寫了部分常用排序算法的理解和實例,希望大家能喜歡! 話不多說 直接上代碼解釋吧   

public class SortArray {

	/***
	 * 冒泡排序  n個人
	 *@description a[0]-a[n-1]比較: 從a[0] 和a[1] 開始比較 如果a[0]>a[1] 則a[0]和a[1]位置互換 再比較a[1]和a[2]
	 * ....最後比較a[n-2]和a[n-1] 這樣一輪下來a[n-1] 一定是這數組中最大的 。再對a[0]-a[n-2]同樣方法排序....
	 * @param array
	 * 時間複雜度 從前依次往後比較次數分別爲(n-1)+(n-2)+....+1 =n*(n-1)/2  O(n2)
	 * 空間複雜度 一個數組 n 也就是O(1)
	 * 穩定性 : 穩定
	 */
	public static void BubbleSort(int[] array){
		//從前往後第一個開始
//		for(int i=0;i<array.length-1;i++){
//			for(int j=0;j<array.length-i-1;j++){
//				int temp=0;
//				if(array[j]>array[j+1]){
//					temp =array[j];
//					array[j]=array[j+1];
//					array[j+1]=temp;
//				}
//			}
//		}
		//從後往前 第a[n-1] 和a[n-2] 比較 若a[n-1]>a[n-2] 則交換位置 a[n-2]和a[n-2]同理,知道a[1]和a[0] 第一輪比較結束 ;
		//第二輪從第a[n-1]-a[1] 依舊
		//每i輪a[i-1] 一定是這組數中最小的值
		for(int i=0;i<array.length;i++){//第i+1次排序
			for(int j=array.length-1;j>i;j--){ //每i輪排序從a[i-1] -a[array.length-1]開始
				if(array[j]<array[j-1]){
					int temp =array[j-1];
					array[j-1]=array[j];
					array[j]=temp;
				}
			}
		}
	}
	
	/***
	 * 選擇排序
	 * @author :yuzg 
	 * @Description:已知一組無序數據a[1]、a[2]、……a[n],需將其按升序排列。
	 * 首先比較a[1]與a[2]的值,若a[1]大於a[2]則交換兩者的值,否則不變。再比較a[1]與a[3]的值,若a[1]大於a[3]則交換兩者的值,否則不變。再比較a[1]與a[4],依此類推,最後比較a[1]與a[n]的值。
	 * 這樣處理一輪後,a[1]的值一定是這組數據中最小的。再將a[2]與a[3]~a[n]以相同方法比較一輪,則a[2]的值一定是a[2]~a[n]中最小的。
	 * 再將a[3]與a[4]~a[n]以相同方法比較一輪,依此類推。共處理n-1輪後a[1]、a[2]、……a[n]就以升序排列了。 注:a[1] 相當於第一個數array[0]
	 * @param array
	 * 思路:每一輪先找到數組中最小值的下標 然後和當前的還沒排好序的第一個換
	 */
	public static void selectionSort(int[] array){
		if(array.length<2){
			return;
		}
		for(int i=0;i<array.length;i++){
			int min_index=Integer.MIN_VALUE;
			for(int j=i+1;j<array.length;j++){
				if(array[i]>array[j]){
					min_index=j;
				}else{
					min_index=i;
				}
			}
			if(min_index !=i){
				int temp=array[i];
				array[i]=array[min_index];
				array[min_index]=temp;
			}
		}
	}
	
	/***
	 * 插入排序
	 * @author :yuzg 共n個元素
	 * @Description:從第二個數字開始和前面的進行比較。找到合適的插入位置ax處(就像我們平常抓牌 ,抓下一張牌後,會把這張牌依次與左手上的牌比較)
	 *  從i-1->x 依次往後退一位,ai 移到x處
	 * @param array
	 * 時間複雜度:從前往後:1+2+3+(n-1) =O(n2)
	 * 空間複雜度 O(1) 
	 * 優點:穩定,快;

	       缺點:比較次數不一定,比較次數越少,插入點後的數據移動越多,特別是當數據總量龐大的時候,但用鏈表可以解決這個問題。
	 */
	public static void insertSort(int[] array){
		int i,j;
		for( i=1;i<array.length;i++){ //從a[1](第二個元素)開始  查找前面需要插入的地方
//			for(j=i-1;j>=0&&array[i]<array[j];j--){//找到x(要插入的下標) 即j最後的值
//				
//			} //上面的for 等價於:
			for(j=i-1;j>=0;){//找到x(要插入的下標) 即j最後的值
				if(array[i]>=array[j]){
					break;
				}else{ //即array[i]<array[j] 
					j--;
				}
				
			}
			//此地注意 因爲滿足array[i]<array[j] 後還要j-- 所以此時 ai 應該插入到aj後面一位
			//從i-1->x都往後移動一位
			int temp =array[i];
			for(int k=i;k>j;k--){
				array[k]=array[k-1];
			}
			array[j+1]=temp;
		}
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] array={1,3,2,45,6,8,7};
//		BubbleSort(array);
//		selectionSort(array);
		insertSort(array);
		for(int i=0;i<array.length;i++){
			System.out.print(array[i]+" ");
		}
	}

}


發佈了27 篇原創文章 · 獲贊 46 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章