c语言冒泡排序和选择排序的使用代码

 更新时间:2022年04月01日 10:20:06   作者:路在何方い  
算法中排序是十分重要的,而每一个学习计算机的都会在初期的时候接触到这种排序,下面这篇文章主要给大家介绍了关于c语言冒泡排序和选择排序使用的相关资料,需要的朋友可以参考下

1.冒泡排序

冒泡排序将一个列表中的两个元素进行比较,并将最小的元素交换到顶部。两个元素中较小的会冒到顶部,而较大的会沉到底部,该过程将被重复执行,直到所有元素都被排序。

冒泡排序示意图

以如图所示的冒泡排序为例,每次比较相邻的两个值,值小的交换到前面,每轮结束后值最大的数交换到了最后。第一轮需要比较4次;第二轮需要比较3次;第三轮需要比较2次;第四轮需要比较1次。

那么如何用二重循环将5个数排序呢?5个数存放在一维数组中,外层循环控制比较多少轮,循环变量i;内层控制每轮比较多少次,循环变量就,如下图所示:

代码如下:

#include <stdio.h>
#define NUM 5
void arrsort(int[],int);
void arrout(int[],int);
 main(){
	 int a[NUM]={16,25,9,90,23};
	 arrout(a,NUM);//输出a数组中原始数据
	 arrsort(a,NUM);//对a数组中的数进行排序
     arrout(a,NUM);//输出排序后a数组中的数据
}
void arrsort(int a[],int n){
	for(int i=0;i<n-1;i++){
		for(int j=0;j<n-1-i;j++){
			if(a[j]>a[j+1]){ 
			  int temp =a[j+1];
			  a[j+1] = a[j];
			  a[j] = temp;
			}
		}
	}
	
}
void arrout(int a[],int n){
   int i;
   for(i=0;i<n;i++){
    printf("%3d",a[i]);
   }
   printf("\n");
 }

输出结果为:

2.选择排序

在介绍选择排序法之前,凭介绍一种把最小的数放在第一个位置上的算法,当然也可以用前面所讲的冒泡排序法,现在我们改用一种新的算法: 其指导思想是先并不急于调换位置,先从a[0]开始逐个检查,看哪个数最小,就记下该数所在的位置p,等一躺扫描完毕,再把a[p]和a[0]对调,这时a[0] a[9]最小的数据就换到了最前面的位置。算法的步骤如下。

(1)先假设a[0]的数最小,记下此时的位置p。

(2)依次把a[p]和a[i](从2变化到9)进行比较,每次比较时,若a[j]的数比a[p]中的数小,则把i的值赋给p,使p总是指向当前所扫描过的最小数的位置,也就是说a[p]总是等于所有扫描过的数中最小的那个数。在依次一一比较后,p就指向 10个数中 最小的数所在位置,即a[p]就是10 个数中最小的那个数。

(3)把a[p]和a[0]的数对调,那么最小的数就在a[0]中了,也就是在最前面了。

如果现在重复此算法,但每重复一次, 进行比较的数列范围就向后移动一个位置,即第二遍比较时范围就从第2个数一直到第 n个数,在此范围内找最小的数的位置p,然后把a[p]与a[2]对调,这样从第2个数开始到第n个数中,最小数就在a[2]中了,第三遍就从第个数到第n 个数中去找最小的数,再把a[p]与a[3]对调..此过程重复n-1次后,就把a组中n个数按从小到大的顺序排好了。这种排序的方法就是选择排序法。

下面我们定义一个临时变量temp代替a[p],进行排序。

选择排序修改为:从键盘输入的十个整数按升序排列输出

#include <stdio.h>
void main(){
  int i,j,k;
  int a[10];
  for(k=0;k<10;k++){
     scanf("%d",&a[k]);
  }
  for(i=0;i<9;i++){
	  for(j=i+1;j<10;j++){
		 
		  if(a[i]>a[j]){ 
		   int temp = a[j];
		   a[j] = a[i];
	        a[i] = temp;
		  }
	  }
	  
 
  }
  for(i=0;i<10;i++){
    printf("%d ",a[i]);
  }
}

区别

1.冒泡排序是比较相邻位置的两个数,而选择排序是按顺序比较,找最大值或者最小值;

2.冒泡排序每一轮比较后,位置不对都需要换位置,选择排序每一轮比较都只需要换一次位置;

3.冒泡排序是通过数去找位置,选择排序是给定位置去找数;

冒泡排序优缺点

1.优点:比较简单,空间复杂度较低,是稳定的;                 

 2.缺点:时间复杂度太高,效率慢;

选择排序优缺点

1.优点:一轮比较只需要换一次位置;

2.缺点:效率慢,不稳定(举个例子5,8,5,2,9   我们知道第一遍选择第一个元素5会和2交换,那么原序列中2个5的相对位置前后顺序就破坏了)。

总结

到此这篇关于c语言冒泡排序和选择排序使用的文章就介绍到这了,更多相关c语言冒泡排序和选择排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++实现读写ini配置文件的示例代码

    C++实现读写ini配置文件的示例代码

    配置文件的读取是每个程序必备的功能,配置文件的格式多种多样,例如:ini格式、json格式、xml格式等。其中属ini格式最为简单,且应用广泛。本文和大家分享了C++读写ini配置文件的方法,需要的可以参考一下
    2023-05-05
  • C++实现银行排队系统

    C++实现银行排队系统

    这篇文章主要为大家详细介绍了C++实现银行排队系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • C语言五子棋小游戏实现代码

    C语言五子棋小游戏实现代码

    这篇文章主要为大家详细介绍了C语言五子棋小游戏实现代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C++数组指针和二维数组详情

    C++数组指针和二维数组详情

    这篇文章主要介绍了C++数组指针和二维数组,指针数组和二维数组在应用中常用于函数传参,下面我们就来看看指针数组和二维数组在应用中的具体使用吧,需要的朋友可以参考一下
    2021-10-10
  • C语言中函数参数的入栈顺序详解及实例

    C语言中函数参数的入栈顺序详解及实例

    这篇文章主要介绍了C语言中函数参数的入栈顺序详解及实例的相关资料,需要的朋友可以参考下
    2017-02-02
  • C语言动态内存管理的原理及实现方法

    C语言动态内存管理的原理及实现方法

    C语言动态内存管理的原理是通过 malloc() 函数申请一块连续的内存空间,并返回其地址,通过 free() 函数释放该内存空间。实现方法是通过在程序运行时动态地管理内存,即在需要内存时申请,不需要时释放,避免了静态内存分配的浪费和不足
    2023-04-04
  • C/C++中比较字符串的方法详解

    C/C++中比较字符串的方法详解

    这篇文章主要介绍了C/C++中比较字符串的方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 使用C语言实现本地socke通讯的方法

    使用C语言实现本地socke通讯的方法

    这篇文章主要介绍了 使用C语言实现本地socke通讯,代码分为服务器代码和客户端代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • Linux下C语言的几道经典面试题小结(分享)

    Linux下C语言的几道经典面试题小结(分享)

    下面小编就为大家带来一篇Linux下C语言的几道经典面试题小结(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • C++入门指南之贪吃蛇游戏的实现

    C++入门指南之贪吃蛇游戏的实现

    这篇文章主要给大家介绍了关于C++入门指南之贪吃蛇游戏实现的相关资料,文章通过示例代码介绍的非常详细,可以让大家能短时间内写出一个贪吃蛇,需要的朋友可以参考下
    2021-10-10

最新评论