首页 > 其他分享 >冒泡排序与选择排序超详细讲解

冒泡排序与选择排序超详细讲解

时间:2024-11-05 12:30:09浏览次数:1  
标签:tmp arr int 元素 冒泡排序 讲解 排序

冒泡排序与选择排序

冒泡排序

condition:输入5个数字,冒泡排序,逆序输出

#include<stdio.h>
int main(){
	int userInput,tmp,i,j,arr[6],flag;
	flag = 0;
	for(int i=0;i<5;i++){
		scanf("%d",&userInput);
		arr[i] = userInput;
	}//依次输入五个数字
	for(int i=0;i<4;i++){//五个数字只需要排序4趟
		for(int j=0;j<4-i;j++){//每一趟交换次数4-i次  第0趟 4次, 第1趟 3次 
			if(arr[j] < arr[j+1]){
				tmp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = tmp;
				flag = 1;//存在交换,更新flag
			}
		}
		if(flag == 0){
			break;
		}//不存在交换,结束!
	}
	
	for(int i=0;i<5;i++){
		printf("%d ",arr[i]);
	}
	return 0;//逆序输出
}

/*输入n个元素n小于20,冒泡排序,逆序输出*/
#include<stdio.h>
int main(){
	int n,a[20],flag = 0, i,j,tmp;
	scanf("%d",&n);
	for(i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	for(i=0;i<n-1;i++){
		for(j=0;j<n-i-1;j++){//一定是(n-1)-i
			if(a[j]<a[j+1]){
				tmp = a[j];
				a[j] = a[j+1];
				a[j+1] = tmp;
				flag = 1;
			}
		}
		if(flag == 0){
			break;
		}
	}
	for(i=0;i<n;i++){
		printf("%d ",a[i]);
	}
	
	return 0;
}

img

选择排序

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

/*选择排序*/
//5个数 由小到大 88 66 99 11 23
//1轮,4次
//就是固定第一位,将a0与其他项比较,比较完后保证a0最小或者最大
//2轮,3次
//a1与剩下的每一项比较
```c
//输入5个数字,选择排序,顺序输出
#include<stdio.h>
int main(){
	int userInput,tmp,i,j,arr[5];
	for(i=0;i<5;i++){
		scanf("%d",&userInput);
		arr[i] = userInput;
	}//依次输入五个数字
	for(i=0;i<4;i++){//五个数字只需要排序4趟
		for(j=i+1;j<5;j++){//这里j不再是交换的次数了,而是剩下数字的角标,因为前面的j就在变化
			if(arr[i] > arr[j]){//固定每一趟的第一个数字,然后和剩下的数字比较
				tmp = arr[i];
				arr[i] = arr[j];
				arr[j] = tmp;
			}
		}

	}
	
	for(i=0;i<5;i++){
		printf("%d ",arr[i]);
	}
	return 0;//顺序输出
}

历史错误:内层循环终止条件错误
交换逻辑错误:一发现arr[i] > arr[j]就交换,导致不必要交换
优化 --> 找到每一趟最小值的下标,每一趟结束后再arr[1]和arr[minIndex]交换

#include<stdio.h>

int main() {
    int userInput, tmp, i, j, minIndex, arr[5];

    // 依次输入五个数字
    for (i = 0; i < 5; i++) {
        scanf("%d", &userInput);
        arr[i] = userInput;
    }

    // 选择排序
    for (i = 0; i < 5 - 1; i++) {  // 进行n - 1趟排序,这里n = 5
        minIndex = i;  // 先假设当前位置的元素就是最小的,记录其索引
        // 在内层循环中找到真正最小元素的索引
        for (j = i + 1; j < 5; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }

        // 如果找到的最小元素索引不是当前假设的索引,就进行交换
        if (minIndex!= i) {
            tmp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = tmp;
        }
    }

    // 顺序输出
    for (i = 0; i < 5; i++) {
        printf("%d ", arr[i]);
    }

    return 0;
}

/*输入n个元素n小于20,选择排序,逆序输出*/
#include<stdio.h>
int main(){
	int n,a[20], i,j,tmp,maxIndex;
	scanf("%d",&n);
	for(i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	for(i=0;i<n-1;i++){
		maxIndex = i;
		for(j=i+1;j<n;j++){
			if(a[j]>a[maxIndex]){
				maxIndex = j;
			}
			if(maxIndex != i){
				tmp = a[i];
				a[i] = a[maxIndex];
				a[maxIndex] = tmp;
			}
		}

	}
	for(i=0;i<n;i++){
		printf("%d ",a[i]);
	}
	
	return 0;
}

img

总结

  • 冒泡排序【每趟保证数组最右端最值元素归位】
    冒泡排序就是它重复地走访要排序的数列,一次比较两个相邻的元素,根据规则进行一定的交换,保证每一趟完成后,最值数在序列的最右端
    核心关注点
    总趟数 === number-1【最后一趟已经有序】
    相邻元素交换冒泡至最右端
    默认趟数从0开始
    交换总次数 === (number-1-i) [两两交换,次数=number-1-i]
    每趟交换次数== number-1(i===第几趟)
  • 选择排序【每趟保证数组最左端最值元素归位】
    首先固定每趟的第一个元素,假设它是最值
    再在这一趟里比较剩下的元素找到最值元素 看是否为第一个假设元素
    不是就交换
    loop

标签:tmp,arr,int,元素,冒泡排序,讲解,排序
From: https://www.cnblogs.com/GJ504b/p/18527589

相关文章

  • 基于大数据 Python短视频推荐系统(源码+LW+部署讲解+数据库+ppt)
    !!!!!!!!!选题不知道怎么选不清楚自己适合做哪块内容都可以免费来问我避免后期給自己答辩找麻烦增加难度(部分学校只有一次答辩机会没弄好就延迟毕业了)会持续一直更新下去有问必答一键收藏关注不迷路源码获取:https://pan.baidu.com/s/1aRpOv3f2sdtVYOogQjb8jg?pwd=jf1d提取码:......
  • 艾卡货车救援系统(源码+文档+部署+讲解)
    本文将深入解析“货车救援系统”的项目,探究其架构、功能以及技术栈,并分享获取完整源码的途径。系统概述货车救援系统是一款专为货车司机和救援服务提供商设计的管理平台,旨在通过集成救援服务管理、合作项目管理、用户管理等功能模块,提高救援服务的效率和响应速度。系统包括管理端和......
  • 计数排序算法
    1、基本思想        计数排序是一种非比较排序算法,其基本思想是通过统计数组中每个元素出现的次数来生成计数数组,然后根据这些统计信息(出现次数、在计数数组中的位置)将元素放回原数组,从而实现排序。2、算法步骤2.1、算法步骤描述:假设需要升序排序1.   ......
  • GESP4级考试语法知识(计数排序-桶排序)
    整数排列参考程序代码:#include<iostream>#include<cstring>usingnamespacestd;intmain(){ inta[101],n,i,j,k; memset(a,0,sizeof(a));//数组清0 cin>>n;//输入数字个数 for(i=1;i<=n;i++) { cin>>k;//输入一个数字,数字范围肯定......
  • GESP4级考试语法知识(插入排序)
    #include<iostream>usingnamespacestd;constintMAXN=10001;intmain(){ intn,i,j,k; floattemp,a[MAXN]; cin>>n; for(i=1;i<=n;i++) cin>>a[i];//输入n个数 for(i=1;i<=n;i++) { for(j=i-1;j>=1;j--)//在前面有序区间为a[i]找合适的插......
  • 细嗦Transformer(三):准备训练,讲解及代码实现优化器、学习率调整策略、正则化和KL散度损
    文章目录关注我:细嗦大模型批处理对象/BatchesandMasking训练循环主函数/TrainingLoop优化器/Optimizer学习率调整策略/Learningrateadjustmentstrategy样例测试正则化/RegularizationLabelsmoothing标签平滑KL散度损失样例测试Github完整代码----求......
  • 数据结构初阶排序全解
    目录1>>排序前言2>>插入排序2.1>>直接插入排序2.2>>希尔排序3>>选择排序3.1>>直接选择排序3.2>>堆排序4>>交换排序4.1冒泡排序4.2快速排序5>>归并排序6>>测试test.csort.hsort.c7>>总结1>>排序前言    排序顾名思义,就是将一组乱序的数,按从大到小......
  • Leetcode—280. 摆动排序【中等】Plus
    2024每日刷题(199)Leetcode—280.摆动排序实现代码classSolution{public:voidwiggleSort(vector<int>&nums){//n[0]≤n[1]≥n[2]≤n[3]//奇数大于等于前面元素偶数小于等于前面元素//352164//35162......
  • C#各种加密方法,字典排序
    1、字符串加密 ///<summary>///获取MD5加密字符串(type:0大写,1小写)///</summary>///<paramname="content">加密内容</param>///<paramname="type">返回格式(0大写,1小写)</param>///<returns></returns>pub......
  • 【笔记/模板】排序算法
    【模板】快速排序-洛谷1.冒泡排序排序原理:每次将未确定部分的相邻两个值对比,设为\(a_{i},a_{i+1}\),如果\(a_{i}>a_{i+1}\),则对这两个值进行交换,可以使用swap来快速对两个值进行交换。那么,这样一轮交换下去,第一个数就可以确定是最小的了。以此类推,直到所有值都被确定,就得出......