三种常见的排序方法

冒泡排序

首先,我们先来看最简单的一种排序方法——冒泡排序:
图一:冒泡排序
冒泡排序,其实就是相邻比较,然后当满足某种要求(前一个大于后一个,或者后一个大于前一个),就进行交换。这样一来,当每次遍历数组后,就会把最大(小)的一个数,移到结尾。
这是一个非常重要的特性,也是因为这个特性,我们才可以得知外层循环应该执行几次(即应该遍历这个数组多少次)。假设数组中有N个元素,因为一次次遍历之后,最后一个无需继续比较了,所以外层循环只需要执行N-1次。相同的,对于内层循环来说,最后一个没有相邻的与之比较,所以也只需要N-1次。
我们来看看实现这种排序的代码:

#include<stdio.h>
int main(){
	int a[10]={3,5,1,14,88,5,3,8,17,9};
	for(int i=0;i<9;i++){
		for(int j=0;j<9;j++){
			if(a[j]>=a[j+1]){
				int t=a[j];
				a[j]=a[j+1];
				a[j+1]=t;
			}
		}
	}
	for(int i=0;i<9;i++)
	printf("%d\n",a[i]);
}

选择排序

在这里插入图片描述
选择排序:它的核心是,每一次进行线性搜索,找到最小值。所以同刚才一样,它的外层循环也是N-1次,内层要从第i个元素开始,一直到最后。
让我们用代码实现它:

#include<stdio.h>
int main(){
	int a[10]={3,7,4,1,5,11,6,4,2,0};
	for(int i=0;i<9;i++){
		for(int j=i+1;j<9;j++){
			if(a[i]>a[j]){
				int t=a[i];
				a[i]=a[j];
				a[j]=t;
			}
		}
	}
	for(int i=0;i<9;i++){
		printf("%d\n",a[i]);
	}
}

插入排序

插入排序,默认最左端的数字已经排序完成,然后取出未排序的数字,将其与左侧已排序的数字进行比较,直到左边部分数字最小的到达最左端,重复直到完成。这样每次都会得出左边的有序数组,第0次一个,第一次是两个数的有序数组…所以第一层循环也只用N-1次。
在这里插入图片描述

#include<stdio.h>
int main(){
	int num[10] = {3,0,1,8,7,2,5,4,9,6};

	for(int i = 0; i < 10-1; i++){
		if(num[i] > num[i+1]){
			int temp = num[i];
			num[i] = num[i+1];
			num[i+1] = temp;
		}
			for (int j = i;j > 0; j--){
				if(num[j] > num[j-1]){
					break;
				} else{
					int temp = num[j];
					num[j] = num[j-1];
					num[j-1] = temp;
				}
			}
		}
	}

	for(int i = 0; i < 10; i++){
		printf("%d ", num[i]);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值