十种排序算法(java描述)

代码中类似mid=(low+high)/2的语句可能会产生溢出,可以改成mid=low+(high-low)/2

一、冒泡排序(时间复杂度:O(n^2),稳定)

public static void bubbleSort(int[] array) {
	boolean flag = true;
	for (int i = array.length - 1; flag && i > 0; i--) {
		flag = false;
		for (int j = 0; j < i; j++) {
			if (array[j] > array[j + 1]) {
				int tmp = array[j];
				array[j] = array[j + 1];
				array[j + 1] = tmp;
				flag = true;
			}
		}
	}
}

二、选择排序(时间复杂度:O(n^2),不稳定)

public static void selectionSort(int[] array){
	for(int i = array.length-1;i>0;i--){
		int maxIndex = i;
		for(int j = 0;j
   
   
    
    array[maxIndex])
				maxIndex=j;
		}
		if(i!=maxIndex){
			int tmp =array[i];
			array[i]=array[maxIndex];
			array[maxIndex]=tmp;
		}
	}
}

   
   

三、直接插入排序(时间复杂度:O(n^2),稳定)

public static void straightInsertionSort(int[] array) {
	for (int start = 1; start < array.length; start++) {
		int key = array[start];
		int pos = start - 1;
		while (pos >= 0 && array[pos] > key) {
			array[pos + 1] = array[pos];
			pos--;
		}
		array[pos + 1] = key;
	}
}

四、折半插入排序(时间复杂度:O(n^2),稳定)

public static void binaryInsertionSort(int[] array) {
	for (int start = 1; start < array.length; start++) {
		int key = array[start];
		int low = 0;
		int high = start - 1;
		while (low <= high) {
			int mid = (low + high) / 2;
			if (array[mid] <= key)
				low = mid + 1;
			else
				high = mid - 1;
		}
		for (int i = start; i > low; i--)
			array[i] = array[i - 1];
		array[low] = key;
	}
}

五、希尔排序(时间复杂度:O(n^1.3),不稳定)

public static void shellSort(int[] array) {
	int interval = 1;
	while (interval < array.length / 3)
		interval = 3 * interval + 1;
	for (; interval >= 1; interval = (interval - 1) / 3) {
		for (int start = interval; start < array.length; start += interval) {
			int key = array[start];
			int pos = start - interval;
			while (pos >= 0 && array[pos] > key) {
				array[pos + interval] = array[pos];
				pos -= interval;
			}
			array[pos + interval] = key;
		}
	}
}

六、快速排序(时间复杂度:O(nlog2n),不稳定)

private static void quickSort(int[] array, int start, int end) {
	if (start < end) {
		int nextStart = start;
		int nextEnd = end;
		int key = array[start];
		while (start < end) {
			while (start < end && key <= array[end])
				end--;
			if (start < end)
				array[start++] = array[end];
			while (start < end && key >= array[start])
				start++;
			if (start < end)
				array[end--] = array[start];
		}
		array[start] = key;
		quickSort(array, nextStart, start - 1);
		quickSort(array, start + 1, nextEnd);
	}
}

public static void quickSort(int[] array) {
	quickSort(array, 0, array.length - 1);
}

七、堆排序(时间复杂度:O(nlog2n),不稳定)

private static void heapAdjust(int[] array, int start, int end) {
	int key = array[start];
	int nextStart;
	while ((nextStart = 2 * start + 1) <= end) {
		if (nextStart < end && array[nextStart] < array[nextStart + 1])
			nextStart++;
		if (key < array[nextStart]) {
			array[start] = array[nextStart];
			start = nextStart;
		} else
			break;
	}
	array[start] = key;
}

public static void heapSort(int[] array) {
	for (int i = array.length / 2 - 1; i >= 0; i--)
		heapAdjust(array, i, array.length - 1);
	for (int j = array.length - 1; j > 0; j--) {
		int tmp = array[0];
		array[0] = array[j];
		array[j] = tmp;
		heapAdjust(array, 0, j - 1);
	}
}

八、归并排序(时间复杂度:O(nlog2n),稳定)

private static void merge(int[] array, int[] left, int[] right) {
	int count1 = 0;
	int count2 = 0;
	int count3 = 0;
	while (count1 < left.length && count2 < right.length) {
		if (left[count1] <= right[count2])
			array[count3++] = left[count1++];
		else
			array[count3++] = right[count2++];
	}
	while (count1 < left.length)
		array[count3++] = left[count1++];
	while (count2 < right.length)
		array[count3++] = right[count2++];
}

public static void mergeSort(int[] array) {
	if (array.length > 1) {
		int[] left = Arrays.copyOfRange(array, 0, array.length / 2);
		int[] right = Arrays.copyOfRange(array, array.length / 2,
				array.length);
		mergeSort(left);
		mergeSort(right);
		merge(array, left, right);
	}
}

九、桶排序(时间复杂度:O(n),稳定)

public static void bucketSort(int[] array, int min, int max) {
	int[] bucket = new int[max - min + 1];
	for (int i = 0; i < array.length; i++)
		bucket[array[i] - min]++;
	for (int j = 1; j < bucket.length; j++)
		bucket[j] += bucket[j - 1];
	int[] tmp = Arrays.copyOfRange(array, 0, array.length);
	for (int k = array.length - 1; k >= 0; k--)
		array[--bucket[tmp[k] - min]] = tmp[k];
}

十、基数排序(时间复杂度:O((n+radix)*digitCount),稳定)

public static void radixSort(int[] array, int digitCount) {
	int divisor = 1;
	while (digitCount > 0) {
		int[] bucket = new int[10];
		for (int i = 0; i < array.length; i++)
			bucket[array[i] / divisor % 10]++;
		for (int j = 1; j < 10; j++)
			bucket[j] += bucket[j - 1];
		int[] tmp = Arrays.copyOfRange(array, 0, array.length);
		for (int k = array.length - 1; k >= 0; k--)
			array[--bucket[tmp[k] / divisor % 10]] = tmp[k];
		divisor *= 10;
		digitCount--;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值