嵌入式学习Day8 C语言 --- 选择、冒泡、插入、快速排序,二分查找

一、选择排序

思想:
   为合适的位置,选择一个合适的数  

//选择排序
	int arr[6] = {1,77,98,76,6,8};
	int len = sizeof(arr)/sizeof(arr[0]);
	int i = 0,j = 0,t = 0;

	for(j = 0;j < len - 1;j++)  //找位置
	{
		//for(i = 0;i < len - j;i++) //找数字法一  
		for(i = 1;i < len - j;i++)   //找数字法二
		{
			if(arr[j] > arr[i+j])     //交换
			{
				t = arr[j];
				arr[j] = arr[i+j];
				arr[i+j] = t;
			}
		}
	}
	for(i = 0;i < len;i++)  //打印排序好的数组
	{
		printf("%d ",arr[i]);
	}

二、冒泡排序

思想:
  相邻两个元素两两比较,小的放前,大的放后

//冒泡排序
	int arr[] = { 8,7,6,5,4,3,2,1 };
	int len = sizeof(arr) / sizeof(arr[0]);  //8
	int t = 0;
	int i = 0, j = 0;

	for (j = 0; j < len - 1; j++) //趟数
	{
		for (i = 0; i < len - j - 1; i++) //每趟的次数
		{
			if (arr[i] > arr[i + 1]) //交换
			{
				t = arr[i];
				arr[i] = arr[i + 1];
				arr[i + 1] = t;
			}

		}
	}

	for (i = 0; i < len; i++) //打印排序好的数组
	{
		printf("%d ", arr[i]);
	}

三、插入排序

思想:排队

//插入排序
	int a[6] = {6,5,4,3,2,1};
  //int b[6] = {0};(思考媒介)
	int len = sizeof(a)/sizeof(a[0]);
	int i = 0,j = 0,t = 0;

	for(i = 0;i < len;i++) //取数
	{
		t = a[i];
		j = i;

		while(j > 0 && a[j-1] > t) //后移找位置
		{
			a[j] = a[j - 1];
			j--;
		}
		a[j] = t; //将对应的值放在合适的位置
	}
	for(i = 0;i < len;i++) //打印排序好的数组
	{
		printf("%d ",a[i]);
	}

四、二分查找

前提:有序数组

//二分查找

	int s1[6] = {1,2,3,4,5,6};
	int len = sizeof(s1) / sizeof(s1[0]);
	int mid = 0,begin = 0,end = len - 1;
	int n = 3;
		while(begin <= end) //注意是<=
		{
			mid = begin + end;

			if(s1[mid] > n)
			{
				end = mid - 1;
			}
			else if(s1[mid] < n)
			{
				begin  = mid + 1;
			}
			else
				break;
		}
		if(begin <= end) //代表是从break出来的
		{
			printf("找到了,下标是%d",mid);
		}
		else
			printf("没找到");

五、快速排序

代码:

系统自带qsort函数

//定义结构体类型
struct student
{
	char name[20];
	int sno;
	float score;
};



//通过系统自带qsort函数来对根据学号大小,分数,姓名进行排序
//调用qsort函数只用写出compar的比较函数内容即可
int compar(const void *a,const void *b)
{
	const struct student *p1 = a;
	const struct student *p2 = b;

//	return p1->sno - p2->sno;
//	return p1->score - p2->score;
	return strcmp(p1->name,p2->name);
}



//实现通过键盘输入结构体成员数据的函数
void inputstudent(struct student *p,int len)
{
	int i = 0;

	for(i = 0;i < len;i++)
	{
		printf("name:");
		scanf("%s",(*(p+i)).name);
//		scanf("%s",(p+i)->name);      //or
		printf("age:");
		scanf("%d",&(*(p+i)).sno);
//		scanf("%d",&(p[i].sno));         //or
		printf("score:");
		scanf("%f",&(*(p+i)).score);
	}
}



//实现输出结构体成员数据的函数
void outputstudent(struct student *p,int len)
{
	int i = 0;

	for(i = 0;i < len;i++)
	{
		printf("%s\n",(*(p+i)).name);
//		printf("%s",(p+i)->name);
		printf("%d\n",(*(p+i)).sno);
//		printf("%d",(p+i)->sno);
		printf("%.2f\n",(*(p+i)).score);

	}
}

int main()
{
	struct student s1[3];
//	inputstudent(s1,3);    
//	outputstudent(s1,3);
//	maxscore(s1,3);
	
	struct student s2[3] = {{"b",2,12},{"a",1,11},{"c",3,13}};  //调用系统自带的qsort函数
	qsort(s2,3,sizeof(struct student),compar);

	outputstudent(s2,3);


	return 0;
}

六、算法稳定性 和 效率( 时间 -- 时间复杂度 )

选择排序、冒泡排序、插入排序时间复杂度相同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值