各种排序原理和code

78 阅读2分钟

选择排序

import java.util.Arrays;
public class selectSort {
	public static void main(String[] args) {
		int[] arr = {3,2,0,5,1,6,7};
		selSort(arr);
	}
	// 选择排序
	private static void selSort(int[] arr) {
		/*
		 * 选择排序的原理:
		 * 找到最小值的索引和第一个索引进行交换,
		 * 再找除了第一个数据以外的最小值的索引.
		 * 然后和第二个数据进行交换
		 * ...
		 **
		 */
		for(int i = 0; i < arr.length - 1; i++) {
			int min = i;
			for(int j = i+1; j < arr.length; j++) {
				if(arr[min] > arr[j]) {
					min = j;
				}
			}
			int temp = arr[i];
			arr[i] = arr[min];
			arr[min] = temp;
					
		}
		System.out.println(Arrays.toString(arr));	
	}
}

冒泡排序

import java.util.Arrays;
public class maopaoSort {
	public static void main(String[] args) {
		int[] arr = {3,2,0,5,1,6,7,1};
		mpSort(arr);
	}
	public static void mpSort(int[] arr) {
		/*
		 * 冒泡排序的原理:
		 * 比较两个相邻的数据, 如果左边的比右边的大就交换位置.
		 * 如果左边比右边小就不动.
		 * 
		 */
		for(int i = 0; i<arr.length - 1; i++) {
			for(int j = 0; j < arr.length - 1 - i; j++) {
				if(arr[j] > arr[j+1]) {
					int temp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = temp;
				}
			}
		}
		System.out.println(Arrays.toString(arr));
	}	
}

插入排序

        // 插入排序
	public static void insertSort(int[] arr) {
		/**
		 * 
		 * 插入排序的原理:
		 * 先做到 0~0 有序
		 * 再做到 0~1 有序
		 * 然后   0~2 有序
		 * 然后   0~3 有序
		 * ....
		 * 最后全部有序
		 * 
		 */
		if (arr == null || arr.length < 2) {
			return;
		}
		for (int i = 1; i < arr.length; i++) {
			for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) {
				swap(arr, j, j + 1);
			}
		}
		System.out.println(Arrays.toString(arr));
	}

递归排序

public class recursionSort {
  public static void main(String[] args) {
    int[] arr = {,3,6,1,7,2,3,1};
    process(arr, 0, arr.length - 1);
    System.out.println(Arrays.toString(arr));

  }
  public static void process(int[] arr, int L, int R) {
    if (L == R) {
      return;
    }
    int mid = L + ((R - L) >> 1);
    process(arr, L, mid);
    process(arr, mid + 1, R);
    merge(arr, L, mid, R);
  }
  public static void merge(int[] arr, int L, int M, int R) {
    int[] help = new int[R - L + 1];
    int i = 0;
    int p1 = L;
    int p2 = M + 1;
    while (p1 <= M && p2 <= R) {
      help[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++];
    }
    while (p1 <= M) {
      help[i++] = arr[p1++];
    }
    while (p2 <= R) {
      help[i++] = arr[p2++];
    }
    for (i = 0; i < help.length; i++) {
      arr[L + i] = help[i];
    }
  }
}


交换值的技巧

public static void swap(int[] arr, int i, int j) {
    //方法一
    // int temp = arr[i];
    // arr[i] = arr[j];
    // arr[j] = temp;
    // 方法二 :异或运算 能这么干的原则是两个数的内存不是同一个
    arr[i] = arr[i] ^ arr[j];
    arr[j] = arr[i] ^ arr[j];
    arr[i] = arr[i] ^ arr[j];

}