ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

挑战程序设计竞赛2-三种初等排序

2021-11-26 09:34:36  阅读:197  来源: 互联网

标签:输出 int sw 程序设计 100 排序 初等 输入


一、插入排序法

       插入排序法类似于打扑克时单手拿牌,用另一只手把牌一张张抽出来再插入前面已拍好序的手牌中,并一直重复这一动作,直到排序完成。

       请编写一个程序,用插入排序法将包含N个元素的数列a按升序排列。 

输入 在第1行输入层定义数组长度的整数N。在第2行输入N个整数,以空格隔开。

输出 输出总共N行。插入排序法每个计算步骤的中间结果各占用1行。数列的各元素之间空1个空格。请注意,行尾元素是后的空格等多余的空格和换行会被认定为Presentation Error。限制  1≤N≤100                                                                                                                                   0≤a的元素≤1000

输入示例     6                                                                                                                                                5  2  4  6  1  3

输出示例                                                                                                                                         2  5  4  6  1  3                                                                                                                             2  4  5  6  1  3                                                                                                                             2  4  5  6  1  3                                                                                                                             1  2  4  5  6  3                                                                                                                             1  2  3  4  5  6                                                                                                                                 

       此过程可以引用一个i=1进行一个外部循环,将a[i]的值临时存入变量v中。再引用一个j进行一个内部循环,j=i-1开始自减(目的是将把v左边所有比他大的数向右移动)。j=-1或a[j]≤v时结束循环,并将v插入当前j+1的位置。 

 

#include<iostream>
using namespace std;
void insert(int x[],int N);
int main()
{
    int n,a[100];
    cin>>n;
    for(int i=0;i<n;i++)
    cin>>a[i];
    insert(a,n);//引用插入排序法的函数 
    return 0;
}

void insert(int x[],int N) 
{
	int v,j;
	for(int i=1;i<N;i++)
	{
		v=x[i];
		j=i-1;
		while(j>=0&&x[j]>v)//通过循环将v插入前面已排好序列 
		{
			x[j+1]=x[j];
			j--;
		}
		x[j+1]=v;
	}
	for(int i=0;i<N;i++) 
    {
    	if(i)cout<<' ';//在相邻元素之间输出一个空格 
		cout<<x[i]; 
	}
}

 二、冒泡排序法

 冒泡排序法为不使用flag的和使用flag的。

       两种方法基本相同。都是通过两两比较大小,将较大的数像冒泡泡一样一点点移向右边,达到升序效果。使用flag即定义一个bool型flag变量。如果为正,进行内部循环;如果为负,跳出内部循环。

        请编写一个程序,读取数列a,利用冒泡排序法将其按升序排列并输出。另外请报告执行元素交换的次数。

输入 在第1行输入定义数组长度的整数n。在第2行输入n个整数,以空格隔开。

输出 输出总计2行。请在第一行输出排序后的数列。数列相邻要素用1个空格隔开。第2行输出元素交换的次数。

限制 1≤n≤100                                                                                                                                    0≤a的元素≤100

输入示例

6

6  5  4  1  3  2

输出示例

1  2  3  4  5  6

13

 

 

 下面来看不使用flag的代码。

#include<iostream>
using namespace std;
int bubblesort(int a[],int);
int main()
{
	int a[100],n,sw;
	cin>>n;
	for(int i=0;i<n;i++)
	cin>>a[i];
	sw=bubblesort(a,n);//sw记录交换次数 
	cout<<"\n交换次数:"<<sw;
	return 0;
}

int bubblesort(int a[],int n)
{
	int sw=0;
	for(int i=0;i<n-1;i++)//两个循环将较大数移像右边 
    for(int j=0;j<n-i-1;j++)
	{
    	if(a[j]>a[j+1])
	   	{
	   	swap(a[j],a[j+1]);//交换相邻元素 
	   	sw++;
		}
	}
	for(int i=0;i<n;i++)
	{
		if(i)cout<<' ';
		cout<<a[i];
	}
	return sw;
}

再来看看使用flag的代码。 

#include<iostream>
using namespace std;
int bubblesort(int a[],int n);
int main()
{
	int a[100],n,sw;
	cin>>n;
	for(int i=0;i<n;i++)
	cin>>a[i];
	sw=bubblesort(a,n);
	for(int i=0;i<n;i++)
	{
		if(i)cout<<' ';
		cout<<a[i];
	}
	cout<<endl;
	cout<<"\n交换次数:"<<sw;
	return 0;
}

int bubblesort(int a[],int n)
{
	int sw=0;
	bool flag=1;
	for(int i=0;flag;i++)
	{
		flag=0;
		for(int j=0;j<n-1-i;j++)
		{
			if(a[j]>a[j+1])
			{
				swap(a[j],a[j+1]);
				flag=1;
				sw++;
			}
		}
	}
	return sw;
}

三、选择排序法

       选择排序法是一种非常直观的算法,它会在每个计算步骤中选出一个最小值,进而完成排序。

       请编写一个程序,读取数列a,利用选择排序法将其按升序排列并输出执行交换次数。

输入 在第1行输入定义数组长度的整数n。在第2行输入n个整数,以空格区分。

输出 输出总计2行。请在第1行输出排序后的数列。数列相邻元素用1个空格隔开。第二行输出交换次数。 

限制 1≤n≤100
        0≤a的元素≤100

输入示例
6

4  1  3  6  2  5

输出示例

1  2  3  4  5  6

4

 

 这里我们要注意,选择排序法属于不稳定的排序算法。因为如果有两个相同的数,我们暂且假设3a,3b。但是通过选择排序之后,则会变成3b,3a。

 

 

#include<iostream>
using namespace std;
int selectionsort(int a[],int n);
int main() 
{
	int a[100],n,sw;
	cin>>n;
	for(int i=0;i<n;i++)
	cin>>a[i];
	sw=selectionsort(a,n);
	for(int i=0;i<n;i++)
	{
		if(i>0)cout<<' ';
		cout<<a[i];
	}
	cout<<"\n"<<sw;
	return 0;
}

int selectionsort(int a[],int n)
{
	int minj,sw=0,i,j;
	for(i=0;i<n-1;i++)
	{
		minj=i;
		for(j=i;j<n;j++)
		{
			if(a[j]<a[minj])minj=j;//记录每次选择出来的最小数下标 
		}
		swap(a[i],a[minj]);
		if(i!=minj)sw++;
	}
	return sw;
}
 
 

标签:输出,int,sw,程序设计,100,排序,初等,输入
来源: https://blog.csdn.net/yxc1535/article/details/121550121

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有