1456 一维数组排序【使用sort函数巧解,以后再也不用写老长的冒泡排序代码了,附四种代码及如何新建C++代码源文件(最后一种时C中的qsort函数)】 Problem B

时间:2024-03-30 09:45:44

题目描述

对一维数组按照从小到大的顺序排序。程序定义函数sort()来实现数组a的排序。函数原型如下:

int sort(int a[], int n);

数组元素的输出调用PrintArr()。

输入

第一行输入一个整数n(1<=n<=10),表示数组有n个整数;第二行输入n个整数。

输出

输出占一行。对这n个整数数按照从小到大的顺序输出,数据之间用一个空格隔开。

样例输入

6
6 5 1 2 3 4

样例输出

1 2 3 4 5 6

提示


思路点拨:因为sort函数在C++的“algorithmh”函数库中已经定义好了,所以我们没有必要再自己写冒泡排序的代码了,直接调用这个函数就行了。但考虑到C语言中没有sort函数,所以我们需要使用C++的编译器才能正常编译,否则会报错(C语言中没有啊)。如果您不知道如何新建C++的文件,请百度或者参考博客最下方的“疑问解答”,我这里先贴下代码哈。另外PrintArr不论是C语言还是C++都没有此的函数,因此需要我们自己定义。

代码示例一:纯粹的C++代码(没学C++,看着比较困难的,请参考代码示例二)。

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
void PrintArr(int a[],int n)
{
    int i;
    for(i=0;i<n;i++)
    {
        if(i==0)
            cout << a[i];
        else
            cout <<' '<< a[i];
    }
}
int main()
{
    int n;
    cin>>n;
    int data[n];
    for(int i = 0; i < n; i++)
        cin >> data[i];
    sort(data,data+n);//data代表要排序数组的开始地址,我们知道数组名就是数组的开始地址。data+n代表数组的结束地址。在sort函数里面只需传数组的开始地址和结束地址就行了。
    PrintArr(data,n);
    return 0;
}
代码示例二:C语言风格的C++代码(注意,一定要放在C++的编译器中运行哈,不然由于C语言没有sort函数和“algorithm”函数库,会报错的,如果您不知道如何新建C++的文件,请百度或者参考博客最下方的“疑问解答”,我这里先贴下代码哈。)。
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
void PrintArr(int a[],int n)
{
    int i;
    for(i=0;i<n;i++)
    {
        if(i==0)
            printf("%d",a[i]);
        else
            printf(" %d",a[i]);
    }
}
int main()
{
    int n;
    scanf("%d",&n);
    int data[n];
    for(int i = 0; i < n; i++)
        scanf("%d",&data[i]);
    sort(data,data+n);//data代表要排序数组的开始地址,我们知道数组名就是数组的开始地址。data+n代表数组的结束地址。在sort函数里面只需传数组的开始地址和结束地址就行了。
    PrintArr(data,n);
    return 0;
}
代码示例三:因为定义函数对于这种小问题来说,反而会显得麻烦一点儿,再加上OJ是黑箱测试,只要结果对就行了,所以我们没有必要定义函数。(注意,一定要放在C++的编译器中运行哈,不然由于C语言没有sort函数和“algorithm”函数库,会报错的,如果您不知道如何新建C++的文件,请百度或者参考博客最下方的“疑问解答”,我这里先贴下代码哈。

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int n,i;
    scanf("%d",&n);
    int data[n];
    for(i = 0; i < n; i++)
        scanf("%d",&data[i]);
    sort(data,data+n);//data代表要排序数组的开始地址,我们知道数组名就是数组的开始地址。data+n代表数组的结束地址。在sort函数里面只需传数组的开始地址和结束地址就行了。
        for(i=0;i<n;i++)
    {
        if(i==0)
            printf("%d",data[i]);
        else
            printf(" %d",data[i]);
    }
    return 0;
}

疑问解答:如何在Codeblocks上新建C++的文件?

第一步:依次单击“file”、“new”、“file”。

第二步:双击“C/C++ source”,接着单击“next”

1456 一维数组排序【使用sort函数巧解,以后再也不用写老长的冒泡排序代码了,附四种代码及如何新建C++代码源文件(最后一种时C中的qsort函数)】 Problem B

第三步:这时它会默认选择“C++”,继续单击“next”。

1456 一维数组排序【使用sort函数巧解,以后再也不用写老长的冒泡排序代码了,附四种代码及如何新建C++代码源文件(最后一种时C中的qsort函数)】 Problem B

第四步:单击图中的三个点,选择一个保存文件的目录。完了之后,单击“finish”

1456 一维数组排序【使用sort函数巧解,以后再也不用写老长的冒泡排序代码了,附四种代码及如何新建C++代码源文件(最后一种时C中的qsort函数)】 Problem B

第五步:这个时候就大功告成了。

1456 一维数组排序【使用sort函数巧解,以后再也不用写老长的冒泡排序代码了,附四种代码及如何新建C++代码源文件(最后一种时C中的qsort函数)】 Problem B

代码示例四:C语言中有个qsort(quick sort快速排序函数),这个函数使用起来没有C++中的sort函数方便简单,因为使用qsort函数必须自己写一个比较函数qsort包含在<stdlib.h>头文件中,此函数根据你给的比较条件进行快速排序,通过指针移动实现排序。排序之后的结果仍然放在原数组中。

虽说使用qsort稍微复杂点儿,但是也是几行代码就搞定的,感觉比写冒泡排序要强多了。

#include<stdio.h>
#include<stdlib.h>
int comp(const void*a,const void*b)//使用qsort函数必须自己写一个比较函数。
{
    return *(int*)a-*(int*)b;//升序;
    //return(*(int *)b-*(int *)a); //降序
}
int main()
{
    int n;
    scanf("%d",&n);
    int i,t,a[n],j;
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    qsort(a,n,sizeof(int),comp);
    for(i=0;i<n;i++)
    {
        printf("%d ",a[i]);
    }
}


关于qsort函数:

以下是参考的网友博客:https://www.cnblogs.com/sooner/archive/2012/04/18/2455011.html

函数原型:

void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );

函数一共四个参数,没返回值。一个典型的qsort的写法如下:

void qsort(s,n,sizeof(s[0]),cmp);
其中第一个参数是参与排序的数组名(或者也可以理解成开始排序的地址);第二个参数是参与排序的元素个数; 第三个参数是单个元素的大小(推荐使用sizeof(s[0])这样的表达式);第四个参数就是需要自己定义的比较函数。

关于cmp这个比较函数(这个函数名时我们自己定义的,大家也可以给它起其他名字 )。典型的cmp的定义是:

int cmp(const void *a,const void *b);
返回值必须是int,两个参数的类型必须都是const void *,那个a,b是可以自己定义的形式参数。 假设是对int排序的话,如果是升序,那么就是如果a比b大返回一个正值,小则负值,相等返回0。

以下是参考的英文资料:

来源:https://msdn.microsoft.com/en-us/library/zes7xw0h.aspx

qsort

void qsort(  
   void *base,  
   size_t num,  
   size_t width,  
   int (__cdecl *compare )(const void *, const void *)   
);  

Parameters

base
Start of target array.

num
Array size in elements.

width
Element size in bytes.

compare
Pointer to a user-supplied routine that compares two array elements and returns a value that specifies their relationship.

The qsort function implements a quick-sort algorithm to sort an array of num elements, each of width bytes. The argument base is a pointer to the base of the array to be sorted. qsort overwrites this array by using the sorted elements.

qsort calls the compare routine one or more times during the sort, and passes pointers to two array elements on each call.

compare( (void *) & elem1, (void *) & elem2 );  

The routine compares the elements and returns one of the following values.

Compare function return value Description
< 0 elem1 less than elem2
0 elem1 equivalent to elem2
> 0 elem1 greater than elem2

The array is sorted in increasing order, as defined by the comparison function. To sort an array in decreasing order, reverse the sense of "greater than" and "less than" in the comparison function.

This function validates its parameters. If compare or num is NULL, or if base is NULL and *num is nonzero, or if width is less than zero, the invalid parameter handler is invoked, as described in Parameter Validation. If execution is allowed to continue, the function returns and errno is set toEINVAL.

Routine Required header
qsort <stdlib.h> and <search.h>
For additional compatibility information, see Compatibility.
// crt_qsort.c  
// arguments: every good boy deserves favor  
  
/* This program reads the command-line  
 * parameters and uses qsort to sort them. It  
 * then displays the sorted arguments.  
 */  
  
#include <stdlib.h>  
#include <string.h>  
#include <stdio.h>  
  
int compare( const void *arg1, const void *arg2 );  
  
int main( int argc, char **argv )  
{  
   int i;  
   /* Eliminate argv[0] from sort: */  
   argv++;  
   argc--;  
  
   /* Sort remaining args using Quicksort algorithm: */  
   qsort( (void *)argv, (size_t)argc, sizeof( char * ), compare );  
  
   /* Output sorted list: */  
   for( i = 0; i < argc; ++i )  
      printf( " %s", argv[i] );  
   printf( "\n" );  
}  
  
int compare( const void *arg1, const void *arg2 )  
{  
   /* Compare all of both strings: */  
   return _stricmp( * ( char** ) arg1, * ( char** ) arg2 );  
}  

boy deserves every favor good