冒泡排序和选择排序

/* 冒泡排序 */
#include<stdio.h>

void BubbleSort (int s[],int n)
{
	int i,j,temp=0;
	int exchange;

	for(i=0;i<n;i++)
	{
	    exchange=0;//多这一个控制条件可以减少很多不必要的循环
		for(j=n-1; j > i; j--)
		{
			if(s[j] < s[j-1]){
				temp=s[j];//注意冒泡排序交换的是相邻两个元素
				s[j]=s[j-1];
				s[j-1]=temp;
				exchange=1;
			}
		}
		if(!exchange)
			return;
	}
}
/* 选择排序 */
void SelectSort(int array[], int n)
{
	int i,j,t;
	for (i=0;i<n-1;i++)
	{
		int pos = i;
		for (j=i+1;j<n;j++)
		{
			if (array[j]<array[pos])
			{
				pos = j;//只是找到位置,并不需要每次都换一下
			}
		}
		//找到位置后才交换,不是交换相邻元素,而是把最小的元素放在s[j]中
		t = array[i];
		array[i] = array[pos];
		array[pos] = t;
	}
}
int main()
{
	int s[10] = {9,2,8,3,4,1,6,7,5,0};
	int n=10;
	int i;

	SelectSort(s,n);

	for(i=0;i<10;i++)
	{
		printf("%d ",s[i]);
	}

	getchar();
	return 0;

}

### 冒泡排序选择排序的区别及实现原理 #### 1. 冒泡排序的实现原理 冒泡排序是一种简单的排序算法,其核心思想是比较相邻的元素。如果前一个元素比后一个元素大,则交换它们的位置。通过多次遍历数组,每次都将未排序部分的最大值“冒泡”到数组末尾[^4]。 以下是冒泡排序的代码实现: ```c void bubble_sort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - 1 - i; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } ``` #### 2. 选择排序的实现原理 选择排序的核心思想是每一轮从待排序部分中找到最小值(或最大值),并将其放到已排序部分的末尾[^4]。具体来说,它通过比较每个元素与当前已知最小值进行交换来完成排序。 以下是选择排序的代码实现: ```c void selection_sort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { int min_index = i; for (int j = i + 1; j < n; j++) { if (arr[j] < arr[min_index]) { min_index = j; } } if (min_index != i) { int temp = arr[i]; arr[i] = arr[min_index]; arr[min_index] = temp; } } } ``` #### 3. 冒泡排序选择排序的区别 - **比较次数**:两种排序方法在最坏情况下的比较次数相同,均为 \(O(n^2)\)[^1]。 - **交换次数**:冒泡排序在每次比较时可能会发生交换,而选择排序仅在每轮结束时发生一次交换。因此,选择排序的交换次数通常较少[^1]。 - **稳定性**:冒泡排序是稳定的排序算法,而选择排序不是稳定排序算法[^3]。 - **内层循环表达方式**:冒泡排序的内层循环是基于相邻元素的比较,而选择排序的内层循环是从当前元素开始寻找最小值[^3]。 - **实现逻辑**:冒泡排序通过“冒泡”的方式将最大值移动到数组末尾,而选择排序通过“选择”最小值将其放置到正确位置[^2]。 #### 4. 时间复杂度与空间复杂度 - **时间复杂度**:两者的时间复杂度均为 \(O(n^2)\),但在实际应用中,选择排序可能稍快一些,因为它的交换次数更少[^1]。 - **空间复杂度**:两者都是原地排序算法,空间复杂度为 \(O(1)\)[^2]。 ### 总结 冒泡排序选择排序虽然都属于简单排序算法,但其实现方式性能特点有所不同。冒泡排序更适合需要稳定性的场景,而选择排序则在交换次数上具有优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值