07-11 冒泡排序、选择排序

博客主要对冒泡和选择排序算法进行总结。冒泡排序是相邻两数对比,将最大或最小数置于数组一端;选择排序是首端或末端数与后面数比较,循环得出排序结果。最后指出两算法各有优劣,关键是理解算法核心。

排序算法有很多,这里就对最简单的俩种冒泡和选择排序总结下自己的理解

1.冒泡排序:
冒泡排序就是把相邻的俩个数进行对比,得出相对大的数继续向后面对比,一圈下来得到最大(最小)的数放在数组最右(左),然后继续把剩下的数用同样的道理对比得出数组大小排序后的结果。
代码如下:

for (i = 0; i < len; i++) { //冒泡排序
		for (j = 0; j < len-1-i; j++) {
			if (arr[j] < arr[j+1]) {
				temp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = temp;
			}
		}
	} 

2.选择排序:
选择排序就是在数组中把首端(末端)的数和后面所有的数进行比较得出最大(最小)的数,然后把第二个数与后面的数比较得出第二大的数,如此循环i-1次,就能得出排序完后的数组。
代码如下:

for (i = 0; i < len - 1; i++) {  // 选择排序
		for (j = i+1; j < len; j++) {
			if (arr[i] < arr[j]) {
				temp = arr[i];
				arr[i] = arr[j];
				arr[j] = temp;
			}
		}
	}

总结: 冒泡和选择算法各有千秋,选择排序我感觉更好理解(刚开始学),不过用那个都可以 ,不用局限于这俩个,还有更多别的算法,主要是理解,理解了算法核心,都没什么难的。?

### 冒泡排序算法实现及详解 冒泡排序是一种简单的排序算法,其核心思想是通过对待排序的序列从前向后依次比较相邻元素的值,如果发现逆序则交换位置[^2]。经过多轮比较和交换后,最终将序列按指定顺序排列。 #### 冒泡排序的基本原理 冒泡排序的基本思想是从无序序列头部开始,进行两两比较,并根据大小交换位置,直到最后将最大(或最小)的数据交换到无序队列的队尾,从而成为有序序列的一部分[^5]。下一次继续这个过程,直到所有数据元素都排好序。 #### 冒泡排序的时间复杂度 冒泡排序的时间复杂度为 \(O(n^2)\),其中 \(n\) 是待排序序列的长度[^2]。这是因为算法需要进行多轮比较,每一轮都需要遍历序列的部分或全部元素。 #### 冒泡排序的稳定性 冒泡排序是一种稳定的排序算法,这意味着在排序过程中,相同值的元素之间的相对顺序不会改变。 #### 冒泡排序的优化 在标准冒泡排序的基础上,可以引入一个标志位来记录每轮排序中是否发生了交换。如果没有发生交换,则说明序列已经有序,可以提前结束排序过程。 #### 冒泡排序的实现 以下是用 C 语言实现的冒泡排序代码: ```c #include <stdio.h> void bubbleSort(int arr[], int n) { int i, j, temp; int flag = 1; // 标志位,用于优化 for (i = 0; i < n - 1 && flag; i++) { flag = 0; // 每轮开始时重置标志位 for (j = 0; j < n - 1 - i; j++) { // 每轮减少比较次数 if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; flag = 1; // 如果有交换,则设置标志位为1 } } } } int main() { int arr[] = {64, 34, 25, 12, 22, 11, 90}; int n = sizeof(arr) / sizeof(arr[0]); bubbleSort(arr, n); printf("Sorted array: \n"); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0; } ``` #### 关于比较次数的优化 有人可能会问程序中为什么每轮比较的次数是 `k < n–1–j`,而不是 `k < n–1`?这是因为冒泡排序有一个特点:每一轮排序后,最大的数会浮到最右面,第二大的数会浮到倒数第二个位置,依此类推。因此,排序多少轮,就有多少个数字已经按排序要求排好了,它们不需要再比较。写 `k < n–1` 也可以,但会导致程序执行时多做许多无用功[^1]。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值