C/C++选择排序与冒泡排序

主要是最近又看了一眼回忆一下,所以就写下来,首先我们要明确这两个算法共同的排序思想,时间复杂度也都是O(n^2),选择与冒泡的区别。 1、我们打个比方,1,2,3,4,5,6,8,7,9,10;是一个无序序列,假如按照从大到小排序,我们的排序思想就是,先O(n)遍历一轮,把其中最大值放到序列的最左边,然后截取一位,实际序列为10,1,2,3,4,5,6,8,7,9,我们要会截取子序列,也就是1,2,3,4,5,6,8,7,9,从这里面找到最大的9放入左边,以此类型,就排序好了,我说的是冒泡与选择共有的思想,我们现在细节一点说。
void bubble_sort(int arr[], int len) {
        int i, j, temp;
        for (i = 0; i < len - 1; i++)
                for (j = 0; j < len - 1 - i; j++)
                        if (arr[j] > arr[j + 1]) {
                                temp = arr[j];
                                arr[j] = arr[j + 1];
                                arr[j + 1] = temp;
                        }
}

//选择
	template<typename T>//从小到大升序
	void selectSort(T arr[], int len) {
		for (int i = 0; i < len; i++) {
			int min = i;
			for (int j = i + 1; j < len; j++) {
				if (arr[j] < arr[min]) {
					min = j;
				}
			}
			if (min != i) {
				std::swap(arr[min], arr[i]);
			}
		}
	}

选择排序的思想不同在于它是改进的冒泡排序,冒泡排序需要一轮一轮的交换,比如1 2 3 4,要把4与3交换比较交换,再于2比较交换,再与1比较交换....每一轮交换的复杂度是O(n),选择排序就不会这样交换,只会交换一次,放到需要的位置,选择排序让它变为常数项,每轮交换只需要O(1),虽然依旧有改进空间,但是不管是选择还是冒泡,在最坏的情况下依旧是O(n^2),理解即可。

最后说一句,序列中字找到最大的,然后找第二大的,以此类推,就完成了排序,记住中心思想就行

经验分享 程序员 微信小程序 职场和发展