七大排序算法之交换排序

冒泡排序

思想:循环n次,交换左右两侧数据

时间复杂度:

平均:O(N^2)

最好:O(N)

平均:O(N^2)

空间复杂度:O(1)

稳定性:稳定排序

代码实现:

// 左右两侧比较
public static void bubbleSort(int[] array) {
	for (int i = 0; i < array.length - 1; ++i) {
		for (int j = 0; j < array.length - i - 1; ++j) {
			if (array[j] > array[j + 1]) {
				int tmp = array[j];
				array[j] = array[j + 1];
				array[j + 1] = tmp;
			}
		}
	}
}

// 优化
public static void bubbleSort2(int[] array) {
	for (int i = 0; i < array.length - 1; ++i) {
		boolean flag = true;
		for (int j = 0; j < array.length - i - 1; ++j) {
			if (array[j] > array[j + 1]) {
				flag = false;
				int tmp = array[j];
				array[j] = array[j + 1];
				array[j + 1] = tmp;
			}
		}
		if (flag) {
			break;// 排序序列本身已有序
		}
	}
}

快速排序

思想:

1、找一个基准值(关键数)

方法1:排序序列中最左/右的数(一般用此方法)

方法2:随机取值

方法3:三数取中法

2、让整个数组中比基准值小的值放于基准值左侧,反之放于基准值右侧

方法1:左右下标法

方法2:挖坑法

方法3:前后下标法

3、将数组分成3部分:左、基准值、右

4、分而治之(子问题的思想)

时间复杂度:

平均:O(NlgN)

最好:O(NlgN)

最坏:O(N^2)//排序序列是逆序的

空间复杂度:O(NlgN);递归时,O(N)

稳定性:不稳定排序

代码实现:

 

 

 

猜你喜欢

转载自blog.csdn.net/tec_1535/article/details/81778190