1. 程式人生 > >排序演算法(不定時更新~)

排序演算法(不定時更新~)

插入排序:

/**
	 * 插入排序
	 * 初始時,拿第二個和第一個比較,如果第二個小於第一個,兩個交換
	 * 當進行到第N次時,前面的N-1個順序應該是正確的
	 * 拿第N個和前面的N-1個數比較,如果第M個小於N,M+1大於N,則把N插到M和M+1中間
	 * 相當於將N和前一個數比較,如果前一個數大於N,則把前一個移動到N的位置上,內層的每個迴圈都是將大於N的數字在向後移以為,也就相當於是將N插在兩個之間。
	 * 
	 * 時間複雜度:n+(n-1)+(n-2)+...+1 = (n+1)n/2=n^2   O(n^2) 空間複雜度:O(1) 穩定
	 * @Title: insertionSort 
	 * @author: wanglh3
	 * @Description: TODO
	 * @param numbers
	 * @return void
	 */    
	public static void insertionSort(int[] numbers){
		for(int i=1;i < numbers.length;i++){
			int temp = numbers[i];
			int j = i-1;
			for(; j >=0 && numbers[j]>temp ;j--){
				if(temp < numbers[j]){
					numbers[j+1] = numbers[j];
				}
			}
			System.out.println(j+"----"+temp);
			numbers[j+1] = temp;
		}
	}

二分排序演算法應該是插入排序的優化演算法,插入時不從一端查詢,而是從中間開始查詢。

氣泡排序

/**
	 * 氣泡排序
	 * 從後往前,先把最小的移到第一位,然後迴圈,把次小的移到第二位
	 * 氣泡排序法的改進:
	 * 1.設定一個標誌變數,如果某一次排序中,沒有進行交換,就可以停止排序
	 * 2.設定一個記錄,標誌某位之後都已經進行排序,之後排序時,無需對之後的元素進行比較
	 * 3.正向逆向同時排序 
	 * 
	 * 時間複雜度:O(n^2) 空間複雜度O(1) 穩定
	 * @Title: bubbleSort 
	 * @author: wanglh3
	 * @Description: TODO
	 * @param numbers
	 * @return void
	 */
	public static void bubbleSort(int[] numbers){
		for(int i = 1; i < numbers.length; i++){
			for(int j = numbers.length-1; j >= i; j--){
				if(numbers[j] < numbers[j-1]){
					int temp = numbers[j];
					numbers[j] = numbers[j-1];
					numbers[j-1] = temp;
				}
			}
		}
	}


選擇排序

/**
	 * 選擇排序
	 * 從未排序的數中,選出最小的,與未排序的第一個數值交換
	 * 改進方法:二元選擇排序
	 * 每次迴圈選出最大的和最小的,最小的和前面的交換,最大的和後面的交換
	 * 時間複雜度:O(n^2) 空間複雜度O(1) 不穩定
	 * @Title: selectionSort 
	 * @author: wanglh3
	 * @Description: TODO
	 * @param numbers
	 * @return void
	 */
	public static void selectionSort(int[] numbers){
		for(int i = 0; i < numbers.length-1; i++){
			int index = i;
			int temp = numbers[i];
			for(int j=i+1;j<numbers.length;j++){
				if(numbers[j]<temp){
					temp = numbers[j];
					index = j;
				}
			}
			numbers[index] = numbers[i];
			numbers[i] = temp;
		}
	}
快速排序
/**
	 * 快速排序
	 * 選擇一個基準,比他大的,都放到他後面,比他小的,都放到他前面
         * 平均時間複雜度是O(nlogn),空間複雜度是O(logn) 不穩定
	 * @Title: quickSort 
	 * @author: wanglh3
	 * @Description: TODO
	 * @param numbers
	 * @return void
	 */
	public static void quickSort(int[] numbers){
		_quickSort(numbers,0,numbers.length-1);
	}
	public static void _quickSort(int[] numbers,int low,int high){
		if(low < high){
			int _low = partition(numbers,low,high);
			_quickSort(numbers,low,_low-1);
			_quickSort(numbers,_low+1,high);
		}
	}
	//{3,7,9,4,2,8,0,1,5}
	public static int partition(int[] numbers,int low,int high){
		int privotKey = numbers[low];//基準數
		while(low < high){
			//如果num[high]>pri  num[low] = num[high]
			//high--
			//
			while(low < high && numbers[high]>=privotKey){
				high--;//當高位大於基準值時,一直向前移動,直到碰到小於基準值的,跳出迴圈,將高位賦值給低位
			}
			numbers[low] = numbers[high];
			while(low < high && numbers[low] <= privotKey){
				low++;
			}
			numbers[high]=numbers[low];
			System.out.println();
		}
		numbers[low] = privotKey;
		
		return low;
	}
	//------------快排end----------------