一维数组,冒泡排序法与选择排序法

选择排序法:从数组中找到最小值排在首位,再从剩余值中选择最小值排到第二位,以此类推

思路:1.第一次遍历数组时找出这个数组中的最小值所对应的下标。然后,把数组中最小值与数组首位元素做交换,从而把最小值放在首位。2.第二次大循环时,数组的遍历从1号下标开始,从剩余数据中找到最小值所对应的下标。然后与arr[1]做交换。

代码如下,给定数组

void select(int* arr, int len) {
	int min_index, temp;         //定义最小值所对应的下标
	for (int i = 0; i < len; i++) {
		min_index = i;
		for (int j = i + 1; j < len; j++) {  //找出最小值所对应的下标
			if (arr[min_index] > arr[j]) {     
				min_index = j;
			}
		}
		temp = arr[min_index];  //第一次大循环交换最小值与数组0号下标的值
		arr[min_index] = arr[i];//第二次大循环交换剩余数中最小值与数组1号下标的值,一直到结束
		arr[i] = temp;
	}
}
int main() {
	int arr[] = { 5,7,9,4,3,6,1,2 };
	int len = sizeof(arr) / sizeof(arr[0]);
	select(arr, len);
	for (int i = 0; i < len; i++) {
		printf("%3d", arr[i]);
	}
	return 0;
}

结果如下:

冒泡排序法,给定数组,两个for循环嵌套 ,里面的for循环用来找出数组中的最大或者最小值放在数组最末位,就像瓶子中水里面冒的气泡一样,最值放到最后。第二个for循环用来将数组中剩余没有排好的数进行多次循环来排列。

封装函数代码如下

void bubble(int* arr, int len) {
	int temp;
	for (int i = 0; i < len; i++) {   //外层for循环,可以将下面没有完全排好的,进行多次循环重排

		for (int j = 0; j < len-1; j++) {
			if (arr[j] > arr[j + 1]) {  //前者大于后者,就交换,一遍下来,最大值就到了最后面
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
		
	}
}

这个代码有弊端,如果数组中的数据稍微比较有序,但它会进行多次没有必要的循环。如何优化来减少不必要的循环次数。1.在for循环之前,定义一个bool类型的变量,bool flag ;2.外层for循环里面flag = false;用假赋值,第二个内层for循环里面flag用true赋值,这样的话,如果数组顺序不对,就会进入内层for循环,flag值就会是true,而如果经历过遍历后,数组中数据已经有序,那么它就不会在进入for循环,flag只就会是false。3.加条件,if(flag == false),就让他退出循环。

代码如下

void bubble(int* arr, int len) {
	int temp;
	bool flag;
	for (int i = 0; i < len; i++) {//外层for循环,可以将下面没有完全排好的,进行多次循环重排
		 flag = false;
		for (int j = 0; j < len-1; j++) {
			if (arr[j] > arr[j + 1]) {  //前者大于后者,就交换,一遍下来,最大值就到了最后面
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
				flag = true;
			}
		}
		if (flag == false) {
			break;
		}
		
	}
}
int main() {
	int arr[] = { 2,1,6,3,5,7,8,9 };
	int len = sizeof(arr) / sizeof(arr[0]);
	bubble(arr, len);
	for (int i = 0; i < len; i++) {
		printf("%3d", arr[i]);
	}
	return 0;
}

退出循环的方法,条件不满足,break,还有返回一个值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值