面試中經常問的三種簡單排序方法

/**
 * 三種簡單的排序
 * 本類中所有舉例都是按照從小到大進行排序
 * @author caohaicheng
 * @time   2014-07-24
 */
public class SortDemo {
	//int[] score={7,10,35,21,78,2,1,9};
	public static void main(String[] args) {
		SortDemo sd=new SortDemo();
		System.out.println("*********************************冒泡排序**********************************");
		//冒泡排序
		sd.BubbleSort();
		
		System.out.println("*********************************選擇排序**********************************");
		//選擇排序
		sd.selectSort();
		
		System.out.println("*********************************插入排序**********************************");
		//插入排序
		sd.insertSort();
	}
	
	/**
	 * 冒泡排序:循環進行相鄰的兩個數比較,然後根據規則決定是否調換位置
	 */
	private  void BubbleSort() {
		int[] score={7,10,35,21,78,2,1,9};	
		for(int i=1;i<score.length;i++){	//最多比較N-1次,每比較一輪就將所參與比較的數的最大值蠕動到這些數的最後面
			/*
			 * 第二次循環的j很關鍵,因爲當第一輪比較結束,數組中的最大的那個值已經被放到最後一位了
			 * 第二輪的時候就不需要最後一個數字參與比較了,比較結束倒數第二大的數放在倒數第二的位置了
			 * 依次類推 ,最多比較N-1次就可以全部排序好。
			 */
			for(int j=0;j<score.length-i;j++){
				if(score[j]>score[j+1]){
					//兩個元素互換位置
					int temp=score[j];
					score[j]=score[j+1];
					score[j+1]=temp;
				}
			}
			System.out.print("冒泡排序第"+i+"次排序結果:");
			for(int k=0;k<score.length;k++){
				System.out.print(score[k]+"\t");
			}
			System.out.println();
		}
		System.out.print("冒泡排序最終排序的結果:");
		for(int i=0;i<score.length;i++){
			System.out.print(score[i]+"\t");
		}
		System.out.println();
	}
	
	/**
	 * 選擇排序:順序依次取出一個數與它後面的所有數進行比較,找出最小的然後交換位置
	 * 冒泡排序是跟相鄰的兩兩比較,發現比他小就交換位置; 而選擇排序是跟所有的都比較之後,確定了哪個最小,再交換位置
	 * 
	 */
	private void selectSort(){
		int[] score={7,10,35,21,78,2,1,9};
		for(int i=0;i<score.length-1;i++){//沒循環依次就找到了一個最小值,最多循環N-1次
			int minIndex=i;
			for(int j=i+1;j<score.length;j++){//跟後面的所有數進行比較,找出那個最小的
				if(score[minIndex]>score[j]){
					minIndex=j;//找到最小值的下標了
				}
			}
			
			//交換位置
			int temp=score[minIndex];
			score[minIndex]=score[i];
			score[i]=temp;
			
			System.out.print("選擇排序第"+i+"次排序結果:");
			for(int k=0;k<score.length;k++){
				System.out.print(score[k]+"\t");
			}
			System.out.println();
			
		}
		System.out.print("選擇排序最終排序的結果:");
		for(int i=0;i<score.length;i++){
			System.out.print(score[i]+"\t");
		}
		System.out.println();
	}
	
	/**
	 * 插入排序:跟玩撲克牌的時候抓牌"碼牌"類似,我們抓第一張牌不用排序,第二張牌要與第一張牌進行比較,如果小於第一張牌,那麼就
	 * 將第一張牌移動到第2的位置上
	 * 以後依次抓牌,與手牌從前往後依次比較,當發現小於某張手牌的時候就將抓到的牌放在該位置,該位置後的牌依次後移。
	 * 
	 */
	private void insertSort(){
		int[] score={7,10,35,21,78,2,1,9};
		for(int i=1;i<score.length;i++){
			int temp=score[i];
			int j=i-1;
			while(j>=0 && score[j]>temp ){
				score[j+1]=score[j];
				j--;
			}
			score[j+1]=temp;
		}
		System.out.print("插入排序最終排序的結果:");
		for(int i=0;i<score.length;i++){
			System.out.print(score[i]+"\t");
		}
		System.out.println();
	}  
	
}

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