排序算法:冒泡排序,选择排序,插入排序

本文详细介绍了三种基本的排序算法:冒泡排序、选择排序和插入排序。冒泡排序通过相邻元素两两比较交换实现排序;选择排序每次找到最大或最小值并交换;插入排序则是将无序元素逐个插入到已排序的序列中。这些算法对于理解排序原理和优化算法性能具有重要意义。
摘要由CSDN通过智能技术生成

排序算法:冒泡排序,选择排序,插入排序

冒泡排序:

冒泡排序是一种基于交换的排序,其基本思想是将相邻元素进行两两比较,如果两者反序,则进行交换,直到没有反序为止。

*例:*将1,3,4,2,5进行排序

第一趟:

  • 比较1和3,不交换位置;1,3,4,2,5

  • 比较3和4,不交换位置;1,3,4,2,5

  • 比较4和2,交换位置; 1,3,2,4,5

  • 比较4和5,不交换位置;1,3,2,4,5

  • 此时确定最大数5的位置

第二趟:

  • 比较1和3,不交换位置;1,3,2,4,5

  • 比较3和2,交换位置; 1,2,3,4,5

  • 比较3和4,不交换位置;1,2,3,4,5

此时确定倒数第一位5与倒数第二位4的位置,以此类推,每一趟确定一个位置,直到所有数确定位置。

由此可见,对N个数进行排序,需要进行N-1趟比较,第i趟的两两比较次数为N-i次。可以使用二重循环语句,外层循环N-1次,内层循环N-i次。

#define NUM 10//可改变输入数据的个数
int main()
{
int arr[NUM],i,j,temp;
printf("输入%d个数字:\n",NUM)
for(i=0;i<NUM;i++)
scanf("%d",&arr[il);
for(i=0;i<NUM-1;i++)
{
//外层循环控制排序趟数//
for(j=0;j<NUM-1-i;j++)
{
//内层循环控制每一趟排序多少次//
if(arr[j]>arr[j+1])
{
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
printf("after sort:\n");
for(i=0; i<NUM; i++)
printf("%d",arr[i]);
return 0;
}

选择排序:

通过一个中间量从待排序的数中找出最大或最小的交换到对应位置。

*例:*将1,6,3,5,8进行排序

  • 1,6,8,5,3; 1与其他数比较,1最小,位置不变

  • 1,3,8,5,6; 6与其他数比较,3最小,6和3交换位置

  • 1,3,5,8,6;8与其他数比较,5最小,8和5交换位置

以此类推,直到确定所有数序。

  1. 取第一个元素的值(设共n个元素),遍历n-1次,用该值与其他元素比较,找到最大或最小的一个数交换。
  2. 取第二个元素的值,遍历n-1次,用该值与剩下其他元素比较,找到最大或最小的一个数交换。
  3. 重复上诉步骤,遍历n次,直到没有要比较的数。
int main()
{
 int i,j,index,n,t,a[100];
 printf("输入数字总数:");
 scanf("%d",&n);//输入几个数的排序 
 printf("输入数字:");
 for(i=0;i<n;i++)
  scanf("%d",&a[i]);//输入数字
 for(i=0;i<n-1;i++)
 {
 index=i;//标记最小数的下标
  for(j=i+1;j<n;j++)  
   {
   if(a[index]<a[j]) index=j;
  if(index>i)//交换两个位置上的数字
   t=a[index],a[index]=a[i],a[i]=t;
   }
 }
 for(i=0;i<n;i++)
  printf("%4d",a[i]);//排序后依次输出  
 return 0;
}

插入排序:

将一个数组分为有序列以及无序列,无序列插入到有序列中。设a[0]为已经排好序的子序列,然后将剩下无序列元素一个一个插入到有序的子序列中。

*例:*将4,3,5,6,2进行排序

  • 确定4是有序的,3小于4则插入到4的前面;3,4,5,6,2
  • 5大于4的同时也大于3,插入4的后面;3,4,5,6,2
  • 6大于5的同时也大于4,插入5的后面;3,4,5,6,2
  • 2小于3则插入3的前面;2,3,4,5,6

得到有序序列:2,3,4,5,6

#define NUM 5
void f(int a[])
{
 int i,j,temp;
 for(i=0;i<NUM;i++)
 {
  temp=a[i];
  if(a[i]<a[i-1])//当前数小于前一位数时
  {//将子序列重新排列为有序序列 
   	for(j=i-1;temp<a[j];j--)
   {
    a[j+1]=a[j];
   }
    a[j+1]=temp;
  }
 }
}
	int main() 
{
	int a[]={4,3,5,6,2}; //输入待排序数组 
	int i;
	printf("未排序前:\n"); 
 	for(i=0;i<NUM;i++)
 {
  printf("%d", a[i]);
 }
 printf("\n经过插入排序后:\n"); 
 f(a);
 for(i=0;i<NUM;i++)
 {
  printf("%d", a[i]);
 }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值