C语言中算法

文章介绍了冒泡排序和选择排序两种基础排序算法的原理和步骤,并提供了C语言的代码示例。冒泡排序通过相邻元素比较交换,逐步归位;选择排序则是在每一轮中找到最大或最小值并放置到正确位置。这两种方法在时间和空间复杂度上有不同特点。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

记录对2种排序的理解

冒泡排序
简单的选择排序


一、冒泡排序与选择排序是什么?

冒泡算法:
冒泡排序是一种交换排序,它的思想是: 每次比较两个相邻的元素, 如果他们反序就把他们交换位置,直到没有反序的记录为止。
  以下面五个数为例, 从大到小排序, 对相邻的两位进行比较,数据为:12, 35, 99, 18, 76
    * 第一趟:
    * 第一次比较: 35, 12, 99, 18, 76
    * 第二次比较: 35, 99, 12, 18, 76
    * 第三次比较: 35, 99, 18, 12, 76
    * 第四次比较: 35, 99, 18, 76, 12
  经过第一趟比较后, 五个数中最小的数已经在最后面了, 接下来只比较前四个数, 依次类推
    * 第二趟
      99, 35, 76, 18, 12
    * 第三趟
     99, 76, 35, 18, 12
    * 第四趟
     99, 76, 35, 18, 12
     比较完成
  所以,冒泡排序的原理为: 每一趟只能将一个数归位, 如果有n个数进行排序,只需将n-1个数归位, 也就是说要进行n-1趟操作(已经归位的数不用再比较)。
选择排序:
简单选择排序的基本思想就是在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。

这里的理解更多的参考了其他大佬的分析–原文链接:https://blog.csdn.net/Chenyukuai6625/article/details/77170059

二、使用步骤

1.冒泡算法

代码如下:

#include<stdio.h>

void Swap(int* arr, int x, int y)
{
	int tmp = arr[x];
	arr[x] = arr[y];
	arr[y] = tmp;
}

void sel_sort(int* arr, int num)
{
	
	int left = 0;
	int right = num - 1;
	while (left < right)
	{
		//先假设最左侧元素的下标未为最小元素的下标,最右侧元素的下标为最大元素的下标。
		int min = left;
		int max = right;
		int i = 0;
		for (i = left; i <= right; i++)
		{
			if (arr[i] < arr[min])
			{
				min = i;
			}
			if (arr[i] > arr[max])
			{
				max = i;
			}
		}
		//最大值放在最右端
		Swap(arr, max, right);
		//由于上一步把下标(right)和(max)上的数据进行了交换
		//所以得考虑最小值(arr[min])在位置(right)的情况,即:此时的 min = right;
		if (min == right)
		{
			min = max;
		}
		//最小值放在最左端
		Swap(arr, min, left);
		//每趟遍历,元素总个数减少2,左右端各减少1,left和right索引分别向内移动1
		left++;
		right--;
	}
}

int main()
{
	int i = 0;
	int arr[] = { 3,5,9,2,4,7 };
	int sz = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数
	sel_sort(arr, sz);//选择排序
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

2.简单的选择排序

代码如下:

#include<stdio.h>
int main()
{
	int array[]={12,8,13,9}
	int i;
	int j;
	int tmp;
	int len=sizeof(array)/sizeof(array[0]);
	//简单的选择排序法
	for(i=0;i<len-1;i++){
		for(j=i+1;j<len;j++){
			if(array[i]<array[j]){
			tmp=array[i];
			array[i]=array[j];
			array[j]=tmp;
			}
		}
	}
	for(i=0;i<len;i++){
		printf("%d",array[i]);
	}	
	return 0;
}

总结

有个形容非常贴切
冒泡排序就像暴力遍历,空间复杂度小,时间复杂度高;
而简单的选择排序就像在等待时机伺机而动;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式的狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值