基礎排序(冒泡排序,選擇排序和插入排序)

一些常見的排序方法,記錄在此。(好記性不如爛筆頭)

一:冒泡排序法:

   1.思路:第一次兩兩遍歷所有的元素,找到最大的元素放置到最右邊,第二次遍歷(n-1)個。這樣下來整個就是從小到大排列了。

public void bubbleSort(int[]source){
		for(int i=source.length-1;i>0;i--){
			for(int j=0;j<i;j++){
				if(source[j]>source[j+1]){//如果大於就進行交換
					int temp=source[j];
					source[j]=source[j+1];
					source[j+1]=temp;
				}
			}
		}
	}

  其實冒泡排序法還可以進行改進:如果掃碼一次沒有進行交換,說明已經是有序的。那就不用進行下面的比較排序了。

   其算法是穩定的。

public void swith(int[] arr, int a, int b) {//進行排序的方法
		int len = arr.length;
		if (a >= len || b >= len) {
			return;
		}
		int temp = arr[a];
		arr[a] = arr[b];
		arr[b] = temp;
	}

	public void bubble(int arr[]) {  
		for (int i = 0; i < arr.length; i++) {
			boolean flag = true;       //標記是否進行接下來的排序標誌
			for (int j = 0; j < arr.length - i - 1; j++) {
				if (arr[j + 1] < arr[j]) {
					flag = false;    
					swith(arr, j, j + 1);
				}
			}
			if (flag) {//如果沒有進行排序,那麼說明是有序的了。直接返回
				return;
			}
		}
	}

二:每次找到一個最小值(也可以是最大值)和對應下標進行交換。比如第一次找到最小值和下標爲0的進行交換。第二次找到最小值(從下標1開始找)和下標爲1的進行交換。

    /**
	 * 選擇排序(每一輪只交換一次)
	 * @param arr
	 */
	public void select(int[]arr){
		for(int i=0;i<arr.length;i++){
			int temp=i;
			for(int j=i+1;j<arr.length;j++){
				if(arr[j]<arr[temp]){
					temp=j;//找到最小的數值的下標,賦值給temp.
				}
			}
			swich(arr, i, temp);//每次循環只交換一次。相對於冒泡排序,減少了交換次數
		}
	}


public void swich(int[]arr,int a,int b){
		if(arr!=null&&a<arr.length&&b<arr.length){
			int temp=arr[a];
			arr[a]=arr[b];
			arr[b]=temp;
		}
	}

 但算法卻是不穩定的。比如  b(3), b1(3) ,c(1)進行選擇排序後。變成了 c(1),b1(3),b(3)。

 b和b1的值是一樣的,都爲3。但進行排序後順序卻變了。所以說該算法是不穩定的。

三.插入排序法.邏輯代碼稍微有點複雜(想好第一步很重要,後面的就是重複操作了)。算法也是穩定的。

    從第一個元素開始,該元素可以認爲已經被排序 -> 取出下一個元素,在已經排序的元素序列中從後向前掃描 -> 如果該元素小於前一個元素,則將兩者調換,再與前一個元素比較–> 重複第三步,直到找到已排序的元素小於或者等於新元素的位置 -> 將新元素插入到該位置中 -> 重複第二步

/**
	 * 假設有部分已經排序好了,現在只需拿未排序的數和已排序好的進行比較。
	 * 找到合適的地方進行插入。剛開始默認第一個數是已經排序好的,
	 * 第一次:所以就拿第二個數(下標爲1)去和第一個數下標爲0(1-1)的數比較
	 * @param arr
	 */
	public static  void insertSort(int[]arr){
		int temp=arr.length;
		for(int i=1;i<temp;i++){
			for(int j=i;(j-1)>=0&&arr[j-1]>arr[j];j--){//之所以要判斷j-1>0;因爲arr[j-1]
				swith(arr, j, j-1);
			}
		}
	}
	private static  void swith(int[]arr,int one,int other){
		int len=arr.length;
		if(one>=len||other>=len){
			System.out.println("下標越界,無法交換數據!!");
			return;
		}
		int temp=arr[one];
		arr[one]=arr[other];
		arr[other]=temp;
	}

好了。基礎算法就記錄到這裏了。

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