1. 程式人生 > 其它 >Algorithm 選擇、冒泡、插入排序

Algorithm 選擇、冒泡、插入排序

選擇排序

    public static void selectSort(int[] arr){
      //邊界判斷啊
        if(arr == null || arr.length < 2 ){
            return ;
        }
        int minIndex;
      //外迴圈是對1-n 取最小值,2-n 取最小值
        for(int i = 0; i < arr.length-1; i++){
            minIndex = i;
          
            for(int j = i+1; j<arr.length -1 ; j++){
              //判斷
                minIndex = arr[j] < arr[minIndex]? j : minIndex;
            }
          //交換
            swap(arr, i, minIndex);
        }
    }
		//交換位置
    public static void swap(int[] arr,int i,int j){
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }   

氣泡排序

public static void bubbleSort(int[] arr) {
		if (arr == null || arr.length < 2) {
			return;
		}
		// 0 ~ N-1
		// 0 ~ N-2
		// 0 ~ N-3
  //氣泡排序是優先將最大值先排好
		for (int e = arr.length - 1; e > 0; e--) { // 0 ~ e
			for (int i = 0; i < e; i++) {
        //大的值往後放
				if (arr[i] > arr[i + 1]) {
					swap(arr, i, i + 1);
				}
			}
		}
	}

	// 交換arr的i和j位置上的值
// 這種等同於tmp做中間變數的交換
	public static void swap(int[] arr, int i, int j) {
		arr[i] = arr[i] ^ arr[j];
		arr[j] = arr[i] ^ arr[j];
		arr[i] = arr[i] ^ arr[j];
	}

插入排序

public static void insertionSort(int[] arr) {
		if (arr == null || arr.length < 2) {
			return;
		}
		// 不只1個數
		for (int i = 1; i < arr.length; i++) { // 0 ~ i 做到有序
			//當j--後 j為-1時,代表這個小排序達成,跳出,進行接下來的排序
			for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) {
				swap(arr, j, j + 1);
			}
		}
	}

	// i和j是一個位置的話,會出錯
	public static void swap(int[] arr, int i, int j) {
		arr[i] = arr[i] ^ arr[j];
		arr[j] = arr[i] ^ arr[j];
		arr[i] = arr[i] ^ arr[j];
	}