排序算法学习笔记

与世无争的帅哥 提交于 2020-01-22 07:41:25

排序算法学习笔记

插入排序

时间复杂度:O(N^2),空间:O(N)
描述:向一个已经排序的串中插入值。

public static void sort(int[] arr){
	int length = arr.length;
	int j = 0;
	for (int p = 1; p < length; p++) {
		int tmp = arr[p];
		for (j = p; j > 0 && tmp < arr[j - 1]; j--) {
			arr[j] = arr[j - 1];
		}
		arr[j] = tmp;
	}
}
归并排序

时间复杂度:O(NlogN) 空间复杂度:O(2N)
描述:合并两个有序串

public static void sort(int[] arr){
	int[] tmp = new int[arr.length];
	msort(arr, 0, arr.length - 1, tmp);
}

private static void msort(int[] arr, int left, int right, int[] tmp) {
	if(left < right){
		int m = (left + right)/2;
		msort(arr, left, m, tmp);
		msort(arr, m + 1, right, tmp);
		merge(arr, left, m + 1, right, tmp);
	}
}

private static void merge(int[] arr, int leftPos, int rightPos, int rightEnd, int[] tmp) {

	int leftEnd = rightPos - 1;
	int tp = leftPos;
	int nums = rightEnd - leftPos + 1;

	while (leftPos <= leftEnd && rightPos <= rightEnd){
		if(arr[leftPos] <= arr[rightPos]){
			tmp[tp++] = arr[leftPos++];
		}else {
			tmp[tp++] = arr[rightPos++];
		}
	}

	while (leftPos <= leftEnd){
		tmp[tp++] = arr[leftPos++];
	}

	while (rightPos <= rightEnd){
		tmp[tp++] = arr[rightPos++];
	}

	for (int i = 0; i < nums; i++, rightEnd--) {
		arr[rightEnd] = tmp[--tp];
	}

}
快速排序

时间复杂度:O(NlogN) 空间复杂度:O(N)
描述:取一个合适的中值,将串分割为两部分,左边是小于等于中值的集合,右边是大于等于中值的集合,
串长度小于等于10时候,采用插入排序以提升性能。

private static int cutoff = 9;

public static void sort(int[] arr){
	quick(arr, 0, arr.length - 1);
}

private static void quick(int[] arr, int left, int right) {
	if(left + cutoff <= right){
		int pov = media(arr, left, right);
		int i = left, j = right;
		for (;;){
			while (arr[++i] < pov){}
			while (arr[--j] > pov){}
			if(i < j){
				swap(arr, i, j);
			}else {
				break;
			}
		}
		swap(arr, i, right);

		quick(arr, left, i - 1);
		quick(arr, i + 1, right);
	}else {
		insertSort(arr, left, right);
	}
}

private static void insertSort(int[] arr, int left, int right) {
	int i = left;
	int j;
	for (i = i + 1; i < right + 1; i++){
		int tmp = arr[i];
		for (j = i; j > 0 && tmp < arr[j - 1]; j--){
			arr[j] = arr[j - 1];
		}
		arr[j] = tmp;
	}
}

private static int media(int[] arr, int left, int right) {
	int m = (left + right)/2;
	if(arr[m] < arr[left]){
		swap(arr, m, left);
	}
	if(arr[right] < arr[left]){
		swap(arr, right, left);
	}
	if(arr[m] < arr[right]){
		swap(arr, m, right);
	}
	return arr[right];
}

private static void swap(int[] arr, int i, int j) {
	int tmp = arr[i];
	arr[i] = arr[j];
	arr[j] = tmp;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!