1.简单排序
设计函数 void bubbleSort(int a[],int n);,实现对整型数组的排序。
输入第一行为一个整数n(0<n<=1000),代表待排序元素的个数。第二行是n个整数,每个整数都不会超过int型的存储范围,为待排序元素。
输出只有一行,为输入的n个待排序元素按从小到大排序后的结果。(建议采用起泡排序算法)
建议设计一个辅助函数:
函数功能:依次输出数组中各个元素,数与数之间用空格分开,最后一个数后没有空格而是换行符
参数说明:数组名,数组内元素个数
void outputData(int data[],int elementCount) ;
函数接口定义:
函数原型如下:
void bubbleSort(int a[],int n);
辅助函数原型:
void outputData(int data[],int elementCount) ;
其中 a
和n
都是用户传入的参数。 n
是大于0且小于等于1000的整数,代表待排序元素的个数; a
是待排序数组。
辅助函数原型: 其中 data
和 elementCount
都是用户传入的参数。 elementCount
是大于0且小于等于1000的整数,代表元素的个数; data
是待输出的数组。
裁判测试程序样例:
设计了辅助函数后,函数被调用的例子如下:
#include<stdio.h>
void bubbleSort(int a[],int n);
//输出数组中所有元素
void outputData(int data[],int elementCount) ;
int main()
{
int n , i, num[10010] ;
scanf("%d",&n);
for( i = 0 ; i < n ; i++ )
scanf("%d",&num[i]) ;
bubbleSort(num,n) ;
outputData(num,n) ;
return 0 ;
}
/* 请在这里填写答案 */
输入样例:
8
49 38 65 97 76 13 27 4
输出样例:
4 13 27 38 49 65 76 97
答案:
void bubbleSort(int a[],int n)
{
int i,loc,t;
//从一开始的0到n-1范围逐渐缩小...
//0~n-1,0~n-2,...,0~2,0~1,一共比较n-1次
for(loc=n-1;loc>=1;loc--){
//每次两两(i和i+1对应的数组值)进行比较,大的排后面
for(i=0;i<=loc-1;i++){
if(a[i]>a[i+1]){
t=a[i];
a[i]=a[i+1];//把大的值排到后面
a[i+1]=t;
// printf("%d\n",a[i]);
}
}
}
}
void outputData(int data[],int elementCount)
{
int i;
for(i=0;i<=elementCount-2;i++){
printf("%d ",data[i]);}
//最后一位不输出空格的方法
printf("%d\n",data[elementCount-1]);
}
2.选择排序
设计函数 void SelectSort(int a[],int n); 使用选择排序算法对数组a的前n个元素按照升序的方式排序。
选择排序算法描述如下: 从a[0]到a[n-1]这段元素中找最小元素a[min],a[0]和a[min]交换;接着,从a[1]到a[n -1]这段元素中找最小元素a[min],a[1]和a[min]交换;依次类推,直到从a[n-2]到a[n -1]这段元素中找最小元素a[min],a[n-2]和a[min]交换。
输入:首先输入一个整数n(1<n<=1000),代表待排序元素的个数。然后是n个整数,每个整数不会超过int型的存储范围
输出为n-1行,依次为1到n-1趟排序后数组内各个元素。每行输出的顺序为a[0]至a[n-1],数与数之间用空格分开,注意第n个数后没有空格而是换行符。
建议设计两个辅助函数:
函数功能:找数组中的最小值元素,并返回其下标
参数说明:数组名,查找起始位置下标,查找终止位置下标
int findMin(int data[], int startLoc, int endLoc) ;
函数功能:依次输出数组中各个元素,数与数之间用空格分开,最后一个数后没有空格而是换行符
参数说明:数组名,数组内元素个数
void outputData(int data[],int elementCount) ;
函数接口定义:
这里是引用三个函数原型如下:
//选择排序(升序)
//参数说明:数组,数组中已有元素个数
void selectSort(int data[],int elementCount) ;
//函数功能:找数组中的最小值元素,并返回其下标
//参数说明:数组名,查找起始位置下标,查找终止位置下标
int findMin(int data[], int startLoc, int endLoc) ;
//输出数组中所有元素
//参数说明:数组,数组中已有元素个数
void outputData(int data[],int elementCount) ;
裁判测试程序样例:
函数被调用的例子如下:
#include<stdio.h>
//选择排序(升序)
//参数说明:数组,数组中已有元素个数
void selectSort(int data[],int elementCount) ;
//函数功能:找数组中的最小值元素,并返回其下标
//参数说明:数组名,查找起始位置下标,查找终止位置下标
int findMin(int data[], int startLoc, int endLoc) ;
//输出数组中所有元素
//参数说明:数组,数组中已有元素个数
void outputData(int data[],int elementCount) ;
int main()
{
int n , i, num[1010] ;
scanf("%d",&n);
for( i = 0 ; i < n ; i++ )
scanf("%d",&num[i]) ;
selectSort(num,n) ;
return 0 ;
}
/* 请在这里填写答案 */
输入样例:
8
49 38 65 97 76 13 27 4
输出样例:
4 38 65 97 76 13 27 49
4 13 65 97 76 38 27 49
4 13 27 97 76 38 65 49
4 13 27 38 76 97 65 49
4 13 27 38 49 97 65 76
4 13 27 38 49 65 97 76
4 13 27 38 49 65 76 97
答案:
void selectSort(int data[],int elementCount)
{
int i,minLoc,temp;
for(i=0;i<=elementCount-2;i++){
minLoc=findMin(data,i,elementCount-1);
//选择排序接到findmin中的最小值该在的位置号
//马上让这个i和返回值调换位置
if(i!=minLoc){
temp=data[i];
data[i]=data[minLoc];
data[minLoc]=temp;
}
outputData(data,elementCount);
}
}
int findMin(int data[], int startLoc, int endLoc)
{
int i,minLoc;
//startloc就是选择排序中循环的i
//endloc就是数组元素个数减一
minLoc=startLoc;
//先初始化最小值所在的数组位置
for(i=startLoc+1;i<=endLoc;i++)
//让数组从一开始的那个值依次去后面的值比较大小
if(data[i]<data[minLoc])
//一旦出现某个位置的元素比之后的都要小的情况
//就把这个位置赋给minloc然后返回给选择排序
minLoc=i;
return minLoc;
}
void outputData(int data[],int elementCount)
{
int i;
for(i=0;i<=elementCount-2;i++){
printf("%d ",data[i]);
}
printf("%d\n",data[elementCount-1]);
}
3.二分查找
设计函数 int BinarySearch(int a[],int n,int key);
利用二分查找算法,在升序排列的数组a的前n个元素中查找值为key的数组元素的下标。如果数组a中存在整数key,则返回下标;否则返回-1。假设数组a中的元素互不相同。
输入与输出要求:
首先输入两个整数n,m,分别代表数组a中元素的个数与需要查找的整数的个数,n(0<n<=2000000)与m(0<m<=100000)。然后分别输入n个整数和m个整数,分别代表存放在数组中的数以及要查找的数。
输出m个整数,分别为要查找的数在数组a中的下标,如果数组a中不存在某个数,则输出-1。数与数之间用空格分开,注意第n个数后没有空格而是换行符。
函数接口定义:
函数原型如下:
int BinarySearch(int a[],int n,int key) ;
其中 a 、 n和 key 都是用户传入的参数。 a被查找的数组; n 是数组长度; key 是要查找的元素。如果找到,则返回该元素在数组中的下标,否则返回-1。
裁判测试程序样例:
函数被调用的例子如下:
#include<stdio.h>
//函数功能:二分查找
//函数参数:分别为被查找的数组,数组长度,所查找的元素
//函数返回值:如果找到,则返回该元素在数组中的下标,否则返回-1
int BinarySearch(int a[],int n,int key) ;
int num[2000010] ;//数据量比较大,将该数组放在全局区
int main()
{
int n , m, i;
int key ;
scanf("%d%d",&n,&m);
for( i = 0 ; i < n ; i++ )
scanf("%d",&num[i]) ;
for( i = 0 ; i < m ; i++ )
{
scanf("%d",&key) ;
printf("%d",BinarySearch(num,n,key)) ;
if ( i != m - 1 ) printf(" ") ;
else printf("\n") ;
}
return 0 ;
}
/* 请在这里填写答案 */
输入样例:
15
20
-293 -213 -23 0 1 5 11 23 56 67 87 273 999 2132 10000
-23 -99999 0 999 953 67 56 44 33 87 -293 23 11 273 -213 2132 10000 87654 1 5
输出样例:
2 -1 3 12 -1 9 8 -1 -1 10 0 7 6 11 1 13 14 -1 4 5
答案:
int BinarySearch(int a[],int n,int key)
{
int middle,left,right;
left=0;right=n-1;
middle=(left+right)/2;
while(left<=right && a[middle]!=key){
if(key<a[middle])
right=middle-1;
else
left=middle+1;
middle=(left+right)/2;
}
if(left>right)
return -1;
else
return middle;
}