数组排序之冒泡法和选择法

排序是一维数组中最经典的常见操作。这一次,我们来聊聊冒泡排序法和简单选择排序法。

一.冒泡排序:
1.算法:
1>.基本思想:在排序过程中对元素进行两两比较,越小的元素会经由交换慢慢‘’浮‘’到数组的最前面(低下标处),像气泡一样慢慢浮起。
2>.本质:
第1趟冒泡:从数组n-1下标的元素到0下标元素遍历,比较相邻元素对,如果后一个元素小于前一个元素,则交换。第一趟结束时,最小元素‘’浮起‘’到达0下标位置。第二趟冒泡:从数组n-1下标的元素到1下标元素遍历(因为0下标的已经是最小元素,已经到位,无需再参加比较),比较相邻元素对,如果后一个元素小于前一个元素,则交换。第二趟结束时,本趟最小元素到达1下标位置。以此类推,最多n-1趟冒泡,便可完成排序。
3>.代码实现如下:

#include<stdio.h>
#define SIZE 10
void print(int a[],int n)
{
	int i;
	printf("The array is:\n");
	for(i=0;i<n;i++)
		printf("%5d",a[i]);
	printf("\n");
}
void BubbleSort(int a[],int n)
{
	int i,j, temp;
	for(i=0;i<n-1;i++)				//共进行n-1趟排序
		for(j=n-1;j>i;j--)			//递减循环,从后往前比较
			if(a[j]<a[j-1])			//两两比较,若后一个元素小则交换该组相邻元素
			{
				temp=a[j-1];
				a[j-1]=a[j];
				a[j]=temp;
			}
}
int main()
{
	int array[SIZE],i=0,n;
	do								//保证读入的数n满足1<=n<=SIZE
	{
		printf("Please input n(1<=n<=%d):",SIZE);
		scanf("%d",&n);
	}while(n<1||n>SIZE);
	printf("Please input %d elements:\n",n);
	for(i=0;i<n;i++)
		scanf("%d",&array[i]);		//读入数组元素
	BubbleSort(array,n);			//调用函数完成排序
	print(array,n);
	return 0;
}

二.选择法排序:
1.算法:
1>.本质:不断查找最大(小)元素的过程。
第一次:n个元素中最小的和第一个元素对换。第二次:n-1个元素中最小的和第二个元素对换。······.第n-1次:最后两个元素比较,小的放到第n-1个元素的位置上
2>.基本思想:把数组分为左右两个半区,左半区为有序子集,右半区为n-1趟选择。每一趟选择都在无序子集(右半区)中选择出最小元素,并与无序子集首元素交换,然后将该元素并入有序子集。共进行n-1趟排序,每趟最多交换一次。
3>.数据结构:数组,嵌套循环,记录本次查找最小值下标的变量,交换的中间变量
4>.代码实现如下:

#include<stdio.h>
void Input(int *pa,int n)
{
	int i;
	printf("Plaese input %d elements:\n",n);
	for(i=0;i<n;i++)					//用for语句控制输入个元素
		scanf("%d",pa+i);				//还可以用&pa[i]代替pa+i
}
void sort(int *pa,int n)
{
	int index,i,k,temp;
	for(k=0;k<n-1;k++)					//k控制排序的趟数,以0到n-2表示所有趟
	{									
		index=k;						//本趟最小位置存于index,开始时为K
		for(i=k+1;i<n;i++)				//通过内层循环找出本趟真正的最小元素
		{
			if(pa[i]<pa[index])			//将本趟最小元素的下标赋给index
				index=i;
		}
		if(index!=k)					//如果本趟最小元素没有到位
		{
			temp=pa[index];				//则通过交换使本趟最小元素到K下标处
			pa[index]=pa[k];
			pa[k]=temp;
		}
	}
}
void Output(const int *pa,int n)
{
	int i;
	for(i=0;i<n;i++)
		printf("%5d",*(pa+i));
	printf("\n");
}
int main()
{
	int a[10],n;						//定义数组,n控制元素个数
	do									//保证读入的n满足1<=n<=10
	{
		printf("Please input n(1<=n<=10):\n");
		scanf("%d",&n);					
	}while(n<1||n>10);
	Input(a,n);							//调用函数,完成输入
	printf("The original array is:\n");
	Output(a,n);						//调用函数,输出原始数组
	sort(a,n);							//调用函数,完成排序
	printf("The sorted array is:\n");
	Output(a,n);						//调用函数,输出排序后的数组
	return 0;
}
后续还有更多本人学习心得,欢迎关注。           
  • 13
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值