关于冒泡

一、将一个整形数组排序:

数组在传参时应该注意:


我们也可以使用指针的方法来进行实现:

定义两个指针:头指针和尾指针

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void bubble_sort(int a[], int size)
{
	assert(a);
	int *start = a;    //定义头指针
	int *end = a + size - 1;//定义尾指针
	while (end > a){     //至少是在第二个,所以要大于第一个
		int flag = 0;     //定义标志位
		for (start = a; start < end; start++)
		{
			if (*start>*(start + 1))    
			{
				flag = 1;
				*start ^= *(start + 1);  
				*(start + 1) ^= *start;
				*start ^= *(start + 1);
			}
		}
		if (flag == 0)   //若标志位不变则说明本身就为有序的
		{
			break;
		}
		end--;    // 进行了一次冒泡,已经将最大的值放在最右侧,将尾指针减1,下一次冒泡则不用再冒这个
	}
}
int main()
{

	int a[] = { 12, 2, 23, 45, 6, 78, 4, 6, 10 };
	int size = sizeof(a) / sizeof(a[0]);
	bubble_sort(a, size);
	system("pause");
	return 0;
}

二、写冒泡排序可以排序多个字符串。

在内部循环(j<size-1-i):在这里-i是因为经历一次外部循环方可找出排序出一个最大的字符串,那么在下一次,就不用再让它进行比较

#include<stdio.h>
#include<stdlib.h>
void string_sort(char *str[],int size)
{
	int i = 0;
	for (i = 0; i < size - 1; i++)  //控制外部循环次数
	{
		int flag = 0;   //设标志位位
		int j = 0;
		for (j = 0; j < size - 1 - i; j++)  //控制内部循环次数,
		{
			if (strcmp(*(str+j), *(str+j+1))>0)  //判断是否需要交换
			{
				flag = 1;
				char *tmp = *(str + j);
				*(str + j) = *(str + j + 1);
				*(str + j + 1) = tmp;
			}
		}
		if (flag == 0)   //若标志位不变,则说明已经为有序
			break;
	}
}
int main()
{
	char *str[] = { "hskd", "abcd", "weqo" };
	int size = sizeof(str) / sizeof(str[0]); //计算字符串长度
	string_sort(str, size);
	int i= 0;
	for (i = 0; i < size; i++)
	{
		printf("%s\n", *(str+i));   //打印字符串
	}
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值