排序算法学习笔记

排序算法学习笔记
插入排序

时间复杂度: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值