选择,冒泡排序

/**
需求:对于给定的一组数据进行降序排序
 数据来源:随机数
 算法:冒泡法,选择法……
 稳定性:
 复杂度:
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10//是元素个数,而不是数组下标最大值,也就是说,最大是a[N-1],没有a[N]!
int main()
{
	int a[N];
	int n;
	int random(int [],int);
	int select(int [],int);
	int bubble(int [],int);
	random(a,N);
	printf("对此随机数序列进行降序排序:\n");
	for(int j=0;j<N;j++)
		printf("%4d",a[j]);
	printf("\n-----------------------------\n");
	printf("|--1 选择排序\n");
	printf("|--2 冒泡排序\n");
	printf("选择您要执行的排序算法序号\n");
	scanf("%d",&n);
	switch(n)
	{//注意加中括号
		case 1:select(a,N);break;
		case 2:bubble(a,N);break;
		default:return -1;
	}
	printf("\n");
	printf("啦啦啦");
	return 0;
}

int random(int a[],int n)
{//生成伪随机数_
	srand(time(0));
	for(int i=0;i<n;i++)
		a[i]=rand()%100;

	return 0;
}

int select(int a[],int n)
{	//复杂度:T(n)=(n-1)(n-2+1)/2=(n-1)^2/2=O(n^2)
	//算法概述:共经历n-1趟,每趟n-i-2次交换,本轮头一个元素跟后面所有元素比较,头一个元素实时变化,
	//稳定性:
	int swap(int&,int&);
	int tmp=0;//用于交换的临时变量
	for(int i=0;i<n-1;i++)
	{
		for(int j=i+1;j<n;j++)//j最大取n-1,i最大取n-2
		{//第I轮把最大的放在最前
			if(a[j]>a[i])
			{
			/*	tmp=a[i];
				a[i]=a[j];
				a[j]=tmp;
				*/
				swap(a[i],a[j]);
			}
		}
	}
	printf("\n");
	printf("选择排序后:\n");
	for(int k=0;k<N;k++)
		printf("%4d",a[k]);
	printf("\n");
	return 0;
}

int bubble(int a[],int n)//再次提醒!:n是元素个数,而不是最大下标!
{//算法概述:共n-1趟,相邻两个交换,每趟交换次数比上一趟少1
//复杂度:T(n)=(n-1)*(n-1+1)/2=n*(n-1)^2/2=O(n^2)
	//稳定性:
	int swap(int&,int&);
	int tmp=0;
	for(int i=0;i<n-1;i++)//轮数
	{
		for(int j=0;j<n-i-1;j++)
		{//每趟交换次数比第一次少(i+1)次,比如3个数,第一次交换2次就行了
			if(a[j+1]>a[j])
			{//使相邻的两元素,左边的比右边的大
			/*	tmp=a[j];
				a[j]=a[j+1];
				a[j+1]=tmp;
				*/
				swap(a[j],a[j+1]);
			}
	
		}
	}
	printf("冒泡排序后:\n");
	for(int k=0;k<n;k++)
		printf(" %d ",a[k]);
	printf("\n");
	return 0;
}

int swap(int &a,int &b)
{
	int tmp;
	tmp=a;
	a=b;
	b=tmp;
	return 0;
}

如题
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值