冒泡排序那个if{}里面是交换数值而不是下标

本文展示了一个使用C语言实现的冒泡排序算法,该算法遍历数组并交换相邻元素以达到排序目的。在`px`函数中,通过两层循环比较并交换数值,实现从大到小的排序。示例代码中,对一个包含11个整数的数组进行了排序,并打印了排序后的结果。这个简单的排序算法在小规模数据排序上具有一定的实用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <string.h>
#include <stdio.h>
void px(int arr[],int sz)
{
	int i = 0;
	for(i=0;i<sz-1;i++)
	{
		int j = 0;
		int a = 0;
		for(a=1,j=0;j<sz-i-1;a++,j++)
		{
			if(arr[j]>arr[a])
			{
				int b = arr[j];
				arr[j] = arr[a];
				arr[a] = b;				
			}
		}		
	}
}
int main()
{
	int arr[] = {5,10,2,8,7,6,3,4,1,9,15};
	int sz = sizeof(arr)/sizeof(arr[0]);
	int i = 0;
	px(arr,sz);
	for(i=0;i<sz;i++)
	{
		printf("%3d",arr[i]);
	}
	return 0;
} 

### 选择排序与冒泡排序的区别及实现原理 #### 基本概念对比 选择排序和冒泡排序都是常见的基础排序法,但两者的实现机制存在显著差异。 - **选择排序**的核心思想是在未排序的部分中寻找最小(或最大)元素,并将其放置到已排序部分的末尾[^2]。 - **冒泡排序**则是通过多次比较相邻元素并将较大的元素逐步向右移动,最终使最大的元素“浮”到数组末端[^3]。 --- #### 实现原理详解 ##### 1. 选择排序 选择排序的主要过程可以分为以下几个逻辑操作: - 遍历整个数组,在当前未排序区域中找到最小值的索引位置。 - 将该最小值与其所在位置交换,从而完成一次局部有序化。 - 断缩小未排序范围,重复上述步骤直到全部数据被处理完毕。 以下是基于 Python 的选择排序实现代码: ```python def selection_sort(arr): n = len(arr) for i in range(n): # 外层循环控制遍历次数 min_index = i # 记录当前轮次中的最小值下标 for j in range(i + 1, n): # 内层循环用于查找剩余列表中的最小值 if arr[j] < arr[min_index]: min_index = j # 如果发现更小的值,则进行交换 arr[i], arr[min_index] = arr[min_index], arr[i] # 测试用例 arr = [64, 25, 12, 22, 11] selection_sort(arr) print("Sorted array:", arr) ``` 此方法的时间复杂度为 O(n²),空间复杂度为 O(1)。 --- ##### 2. 冒泡排序 冒泡排序的工作流程如下: - 对于每一轮外层迭代,依次比较相邻两个元素大小关系。 - 若前一个元素大于后一个元素则互换两者顺序;如此反复执行直至最后一项无需再调整为止。 - 这种方式使得每次都能让较大数值逐渐移至右侧形成新的子集边界条件下的稳定状态。 下面是采用 Java 编写的冒泡排序版本实例演示: ```java public class BubbleSortExample { public static void bubbleSort(int[] arr) { int n = arr.length; boolean swapped; // 添加标志位优化性能 for (int i = 0; i < n - 1; i++) { swapped = false; // 内部循环负责逐对比较并决定是否需要交换 for (int j = 0; j < n - 1 - i; j++) { if (arr[j] > arr[j + 1]) { // swap elements at index 'j' and 'j+1' int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; swapped = true; } } // If no two elements were swapped by inner loop then break if (!swapped){ break; } } } /* Function to print an array */ public static void printArray(int[] arr) { System.out.println(Arrays.toString(arr)); } public static void main(String args[]) { int[] data = {89, 78, 61, 53, 23}; System.out.println("Unsorted Array:"); printArray(data); bubbleSort(data); System.out.println("\nSorted Array in Ascending Order:"); printArray(data); } } ``` 同样地,其时间复杂度也是O(n²),但在某些特定情况下可以通过引入额外变量来减少必要的运量达到一定效率提升效果[^4]。 --- ### 总结区别要点 | 特性 | 选择排序 | 冒泡排序 | |--------------------|-----------------------------------|----------------------------------| | 数据移动频率 | 较少 | 更频繁 | | 是否支持原地修改 | 是 | 是 | | 平均/最坏情况时间复杂度 | \(O(n^2)\) | \(O(n^2)\) | | 最好情形时间复杂度 | \(O(n^2)\) (即使已经排好序仍需扫描一遍确认) | 可能提前终止 (\(O(n)\)) | 尽管两种法都属于简单的二次方级别解决方案,但由于它们各自独特的特性决定了应用场景各有侧重:当目标仅限于少量记录或者希望降低内存占用时可以选择前者;而后者更适合那些允许更多交互动作且期望获得更好表现机会的任务环境之中[^1]^.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

进击的程序员!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值