1. 程式人生 > >java 快速排序 插入排序 選擇排序

java 快速排序 插入排序 選擇排序

package 未做_快速排序_歸併排序_二分查詢_等排序;
/*
 * 快速排序
 * 使用遞迴方法
 * 把陣列拆分為兩個子陣列加上一個基準元素: 
 * 1.選取最後一個元素作為基準元素,index變數記錄最近一個小於基準元素的元素所在的位置,
 * 初始化為start- 1,發現新的小於基準元素的元素,index加1。
 * 從第一個元素到倒數第二個元素,依次與基準元素比較,
 * 小於基準元素,index加1,交換位置index和當前位置的元素。
 * 迴圈結束之後index+1得到基準元素應該在的位置,交換index+1和最後一個元素。
 * 2.分別排序[start, index], 和[index+2, end]兩個子陣列
 * 
 */
public class QuickSort {
	public static void main(String args[]){
		int[] arr = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3 };  
		
		quictSort(arr);
		print(arr);
		
	}
	
	public static void print(int[] arr){
		for(int i=0;i<arr.length;i++){
			System.out.print(arr[i]);
			System.out.print(",");
		}
	}
	public static void jiaohuan(int[] arr, int index1, int index2){
		int temp = arr[index1];
		arr[index1] = arr[index2];
		arr[index2] = temp;
	}
	
	public static void quictSort(int[] arr){
		quictSort(arr, 0 , arr.length-1);
	}
	public static void quictSort(int[] arr, int start, int end){
		if(arr == null || end<2){
			return ;//若只有1個元素或沒有元素,沒必要排序,停止程式
		}
		
		int part = partition(arr, start , end);//求基準元素應該所在的位置
		if(part == start){
			quictSort(arr, part+1, end);//遞迴處理 part之後的陣列元素
		}else if(part == end){
			quictSort(arr, start, part-1);//遞迴處理 part之前的陣列元素			
		}else{
			quictSort(arr, start, part-1);//遞迴處理 part之前的陣列元素			
			quictSort(arr, part+1, end);//遞迴處理 part之後的陣列元素			
		}
		
	}
	public static int partition(int[] arr, int start, int end){
		int value = arr[end];//選取最後一個元素為基準元素
		int index = start-1;//為了從start---end-1 進行比較 每次index+1;
		
		for(int i=start; i<end; i++){
			if(arr[i]<value){//若元素小於最後一個元素的值 則index +1 繼續向前走
				index++;
				if(index != i){//交換當前index 與i位置的值
					jiaohuan(arr, index, i);
				}
			}
			
		}
		if((index+1) != end ){
			jiaohuan(arr, index+1, end);			
		}
		return index+1;//得到基準元素所在的位置
	}
	
}

package 未做_快速排序_歸併排序_二分查詢_等排序;
/* 插入排序
 * 升序
 * 1.選取第一個元素為基準元素
 * 2.若第二個元素小於基準元素,則把第二個元素插入到第一個元素的前面,把第二個元素作為基準元素
 * 3.直到所有元素插入為止
 */
public class insertSort {
	public static void main(String args[]){
		int[] arr = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3 };
		
		Sort(arr);
		print(arr);
		
	}
	
	public static void Sort(int[] arr){
		if(arr == null || arr.length<2){
			return ;
		}
		for(int i=1;i<arr.length;i++){
		//從第i個元素開始與i之前的元素進行比較 若當前元素小於i之前的元素 則進行交換值,直到交換到第0個元素為止
			int value = arr[i];
			int position = i;//記錄當前元素的位置
			for(int j=i-1;j>=0;j--){
				if(arr[j]>value){
					arr[j+1]=arr[j];//若當前值前面的值大於當前值,則把前面的值賦給後面的值
					position-=1;//記錄value應該在的位置
				}else{
					break;
				}
			}
			arr[position] = value;//把當前值放在當前位置上
		}
	}
	public static void print(int[] arr){
		for(int i=0;i<arr.length;i++){
			System.out.print(arr[i]);
			System.out.print(",");
		}
	}
}

package 未做_快速排序_歸併排序_二分查詢_等排序;
//選擇排序
public class SelectSort {
	public static void main(String args[]){
		int[] arr = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3 };
		Sort(arr);
		print(arr);
		
	}
	
	public static void Sort(int[] a) {  
        if (a == null || a.length <= 0) {  
            return;  
        }  
        for (int i = 0; i < a.length; i++) {  
            int min = i; /* 將當前下標定義為最小值下標 */  
  
            for (int j = i + 1; j < a.length; j++) {  
                if (a[min] > a[j]) { /* 如果有小於當前最小值的關鍵字 */  
                    min = j; /* 將此關鍵字的下標賦值給min */  
                }  
            }  
            if (i != min) {/* 若min不等於i,說明找到最小值,交換 */  
                int tmp = a[min];  
                a[min] = a[i];  
                a[i] = tmp;  
            }  
        }  
    }  
	public static void print(int[] arr){
		for(int i=0;i<arr.length;i++){
			System.out.print(arr[i]);
			System.out.print(",");
		}
	}
}