排序算法

算法入門理解

1.以下文章只適合算法入門愛好者,排序算法篇

理解的基礎交換

        //實現左右值的交換
        int tmp=arr[i]; //tmp作爲臨時變量
        arr[i]=arr[i+1]; //右側賦值給左側(左側值被覆蓋)
        arr[j+1]=tmp;//將臨時變量的值

將問題F(N)拆分爲F(N-1)+1即F(N)=F(N-1)+1個問題;個人理解就是,一趟排序實現左右側的數據交換,重複此步驟達到排序目的

A:冒泡排序

	/**
	 * 冒泡排序
	 * 原始定義:
	 * 
	 * 1、從列表的第一個數字到倒數第二個數字,逐個檢查:若某一位上的數字大於他的下一位,則將它與它的下一位交換。
                     2、重複1號步驟,直至再也不能交換。
//個人理解:N次排序實現左右數據交換;程序有一個入口,一個出口,入口第一個和第二個比較,
//出口最後兩個元素進行比較
	 * @param arr
	 */
	public static void bubbleSort(int [] arr) {
		
		for (int i = 0; i < arr.length-1; i++) { //需要的排序次數
			for (int j = 0; j < arr.length-1-i; j++) {  //01一趟排序,先寫for循環,爲何要減i,對排序算法的改進,
				//因爲每次排序,到最後的數,都爲最小或者最大,排序一次交換次數減少一次,減少i次
               //爲什麼還要減1,防止越界異常
				if(arr[j]>arr[j+1]) { //02比較左右側,符合條件進行交互
					int tmp=arr[j+1];
					arr[j+1]=arr[j];
					arr[j]=tmp;
				}
			}
		}
	}

B快速排序

	/**
	 * 快速排序:它採用了分治的思想:先保證列表的前半部分都小於後半部分,然後分別對前半部分和後半部分排序,這樣整個列表就有序了
	 * 個人理解:一趟排序將數據分爲兩個部分,遞歸調用自身達到完整排序
	 * 
	 * @param arr
	 * @param low
	 * @param high
	 */
	public static void quickSort(int[]arr,int low,int high) {
		if(low>=high) { //程序的出口
			return;
		}
		int i=low;
		int j=high;
		int key=arr[low]; //作爲臨時變量tmp和中間值的作用,由於第一次並不知道誰是中間值
		while(i<j) {  // 01,一趟排序
			//以下兩個while循環是爲數據交換準備,循環次數右遞歸控制
			while(i<j&&arr[j]>key) { //02交換的條件,02和03的順序不能調換,因爲會產生數據覆蓋的問題,原因考慮 左右數據交換的原理
				j--; //高位往下走   ,在c語言中是指針從尾部向中間
			}
			arr[i]=arr[j];  //當不大於時,將高位的值賦給低位,此時tmp已存儲值不用擔心丟失的問題
			
			while(i<j&&arr[i]<key) {//03交換的條件
				i++;
			}
			arr[j]=arr[i];
		}
		arr[i]=key;  //此步驟相當於將tmp賦值給arr[i];
		
		quickSort(arr,low,i-1); //對比中間值小的進行遞歸調用
		quickSort(arr,i+1,high);//對比中間值大的進行遞歸調用
		
	}

 

 

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