11.13 早上 冒泡排序和选择排序的区别

发布于 20 天前  28 次阅读


#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main() {
	int in[6666];
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		scanf("%d", &in[i]);
	}
	//开始冒泡
	for (int i = 0; i < n-1; i++) {
        //总共是从0到n-1,i=n-2的时候,除了最后一个就已经全部送出去了 而这最好一个,难道还需要排吗?
		for (int j = 0; j < n-1-i; j++) {
	 //j<n-1-i,而不是j<n,因为下面的in[j+1],避免数字越界		
            if (in[j] > in[j + 1]) {
				int  temp = in[j];
				in[j] = in[j + 1];
				in[j + 1] = temp;
			}
		}
	}
	return 0;
}

这里的意义发生了改变

// i 从0到n-2,j在内层循环中要减去已经排好了的元素个数 i(已经排好了就在最后面,不用管了,和选择排序差不多,选择排序是将已经排好了的放在前面然后不管,因为它的内层循环是j=i+1)

外层循环的i是代表已经排好序了的元素数量,而内层循环j每次循环都必须是从0开始(我选择排序比这个吊好吧),如果排到了第n-2个就已经排完

在这个例子,冒泡是将大的数放到最后

每次外层循环结束时,最大的元素会被“冒泡”到数组的末尾

持续地迭代,将实现全部排序


在冒泡排序中,每一次的内存循环,都是比较相邻的元素的大小,这样做只能保证最末尾的元素是最大/最小的,但是前面的元素仅是相邻的元素大小有了保证

我个人认为,冒泡排序和选择排序,殊途同归

但为什么人家都说选择排序更好,个人看法是,冒泡排序每一次循环都要不停的交换相邻的值(如果满足条件的话),但是选择排序的每一次内部循环都只是为了判断并找出那个最大的值然后把他标记,最后如果真的判断有的话,将这个值与in[i]进行交换,不会涉及到不停地交换这一步骤

届ける言葉を今は育ててる
最后更新于 2024-11-16