冒泡排序

冒泡排序

时间复杂度\(\mathrm{O}(n^2)\)

冒泡算法思路如图所示


两两比较相邻的两个元素,如果逆序就交换

//这里使用的方法是从开头将大的元素一个个往后放,
//有些也可能是从后面开始将小的元素一个个往前顶
void bubbleSort(int *a, size_t size) {
	for (int i = size - 1; i > 0; --i) {
		for (int j = 0; j < i; ++j) {
			if (a[j] > a[j + 1])
				swap(a[j], a[j + 1]);
		}
	}
}

算法改进一

当一趟排序没有发生任何交换操作时,则此段元素就是有序的,布尔类型的sorted就用来指示是否有序

void bubbleSortA(int *a, size_t size) {
	bool sorted;
	for (int i = size - 1; i > 0; --i) {
		sorted = true;
		for (int j = 0; j < i; ++j) {
			if (a[j] > a[j + 1]) {
				sorted = false;
				swap(a[j], a[j + 1]);
			}
		}
		if (sorted)
			return;
	}
}

算法改进二

经过几次排序后,可能有些片段会变得有序,用last表示从last开始后面都是有序的

void bubbleSortB(int *a, size_t size) {
	size_t last;
	for (int i = size - 1; i > 0; ){
		last = 0;
		for (int j = 0; j < i; ++j) {
			if (a[j] > a[j + 1]) {
				last = j + 1;
				swap(a[j], a[j + 1]);
			}
		}
		i = last;
	}
}
posted @ 2019-04-08 14:56  start-from-ling  阅读(149)  评论(0)    收藏  举报