C语言中的排序法-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

C语言中的排序法

知与谁同 2018-07-21 09:28:58 912
请教下C中对于数据多,处理效率较高的排序法及其实际如何编写,运用
排序c语言 c/c排序
分享到
取消 提交回答
全部回答(5)
  • 云篆
    2019-07-17 22:49:30
    快速排序最快,程序有点多,你不如看看书吧
    0 0
  • boxti
    2019-07-17 22:49:30
    兄弟可以看看算法设计与分析的书。
    排序效率较高的算法,这里的效率要从时间复杂度和空间复杂度两个方面去考虑。
    一般的选择排序与冒泡排序的时间复杂度都是n的平方,n是输入问题的规模。
    有效率较高的算法,如快速排序,堆排序……
    详细的说来,一时半会也说不完的
    实际如何编写,网上有很多,照我上边的很容易找到。
    0 0
  • 游客886
    2019-07-17 22:49:30
    qsort 功 能: 使用快速排序例程进行排序
    用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));
    各参数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针,用于确定排序的顺序
    程序例:
    #include <iostream>
    using namespace std;
    #include <stdlib.h>
    #include <string.h>
    int compare( const void *a, const void *b);
    char * list[5]= {"cat","car","cab","cap","can"};
    int main()
    pascal 例程
    program quicksort;
    const
    max = 100000;
    max = 1000;
    type
    tlist = array[1..max] of longint;
    var
    data : tlist;
    i : longint;
    procedure qsort(var a : tlist);
    procedure sort(l,r: longint);
    var i,j,x,y: longint;
    begin
    i:=l; j:=r;
    x:=a[(l+r) div 2];
    repeat
    while a[i]<x do inc(i);
    while x<a[j] do dec(j);
    if i<=j then
    begin
    y:=a[i];a[i]:=a[j];a[j]:=y;
    inc(i);dec(j);
    end;
    until i>j;
    if l<j then sort(l,j);
    if i<r then sort(i,r);
    end;
    begin
    sort(1,max);
    end;
    begin
    write('Creating ',Max,' random numbers between 1 and 500000');
    randomize;
    for i:=1 to max do
    data:=random(500000);
    writeln;
    writeln('Sorting...');
    qsort(data);
    writeln;
    for i:=1 to max do
    begin
    write(data:7);
    if (i mod 10)=0 then
    writeln;
    end;
    end.
    c/c++
    c函数qsort()和bsearch()的用法
    使用qsort()排序 并 用 bsearch()搜索是一个比较常用的组合,使用方便快捷。
    qsort 的函数原型是void __cdecl qsort ( void *base, size_t num, size_t width, int (__cdecl *comp)(const void *, const void* ) )
    其中base是排序的一个集合数组,num是这个数组元素的个数,width是一个元素的大小,comp是一个比较函数。
    比如:对一个长为1000的数组进行排序时,int a[1000]; 那么base应为a,num应为 1000,width应为 sizeof(int),comp函数随自己的命名。
    qsort(a,1000,sizeof(int ),comp);
    其中comp函数应写为:
    int comp(const void *a,const void *b)
    {
    return *(int *)a-*(int *)b;
    }
    是对一个二维数组的进行排序:
    int a[1000][2]; 其中按照a[0]的大小进行一个整体的排序,其中a[1]必须和a[0]一起移动交换。
    qsort(a,1000,sizeof(int)*2,comp);
    int comp(const void *a,const void *b)
    {
    return ((int *)a)[0]-((int *)b)[0];
    }
    对字符串进行一个排序:
    char a[1000][20];
    qsort(a,1000,sizeof(char)*20,comp);
    int comp(const void *a,const void *b
    {
    return strcmp((char *)a,(char *)b);
    }
    对一个结构体进行排序:
    typedef struct str
    {
    char str1[11];
    char str2[11];
    }str,*stri;
    str strin[100001]=;
    int compare(const void *a,const void *b)
    {
    return strcmp( ((str*)a)->str2 , ((str*)b)->str2 );
    }
    qsort(strin,total,sizeof(str),compare);
    程序例:
    #include<iostream.h>
    #include<stdlib.h>
    #include<string.h>
    #define N 8
    int compare(const void *a,const void *b);
    void main()
    {
    char s[8][10]={"January","February","March","April","May","June","July","September"};
    int i;
    qsort(s,8,sizeof(char)*10,compare);
    for(i=0;i<N;i++)
    {
    for(j=0;j<10;j++)
    cout<<s[j];
    cout<<endl;
    }
    }
    int compare(const void *a,const void *b)
    {
    if(strlen((char *)a)!=strlen((char *)b))
    return strlen((char *)a)-strlen((char*)b);
    return (strcmp((char *)a,(char *)b));
    }//vc++ 6.0

    // VS2008编译通过,具有代表性的例子
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    int compare(const void *arg1,const void *arg2);
    int main(int argc,char **argv)
    {
    int i;
    argv++;
    argc--;
    qsort((void *)argv,(size_t)argc,sizeof(char *),compare);
    for(i=0;i<argc;++i)
    {
    printf("%s ",argv);
    printf("\n");
    }
    }
    int compare(const void *arg1,const void *arg2)
    {
    return _stricmp(*(char **)arg1,*(char **)arg2);
    }
    在运行输入cmd,在qsort.exe 参数1 参数2
    将会排序

    下面讲解下Pascal的快排代码
    program kuaipai;
    var
    save:array[-1..10000000]of longint;//保存数字的数组
    n,i:longint;
    procedure qsort(x,y:longint);
    var
    a,b,c,em,d,mid,e,i,j,k,l:longint;
    begin
    i:=x;//i代表第一个数字的数组坐标,下面叫“左指针”
    j:=y;//j代表第二个数字的数组坐标 叫"右指针"
    mid:=save[(x+y)div 2];//取,这2个数字中间的数组坐标(二分)
    repeat
    while save[i]<mid do inc(i); //在中间这个数字的左边,找比中间数大的数字
    while save[j]>mid do dec(j);//在中间数右边,找比中间数小的数字
    if i<=j//如果左指针在右指针左边
    then begin
    em:=save[i];//交换2个数字的值,这个你会冒泡排序,或者选择排序任意一个,应该明白
    save[i]:=save[j];
    save[j]:=em;
    inc(i);
    dec(j);
    end;
    until i>j;//左指针跑到右指针右边了。。。
    if i<y then qsort(i,y);//如果左指针,没到界限,那么 从左指针到界限进行上述排序
    if j>x then qsort(x,j);//如果右指针没跑到,左界限,那么从右指针到左界限排序
    end;
    begin
    randomize;//优化程序用的,暂时你不用会
    readln(n);//读入,表示有N个数字
    for i:=1 to n do//读入这N个数字
    read(save[i]);
    qsort(1,n);//从第一个数字,到最后一个数字排序
    for i:=1 to n do//输出
    write(save[i],' ');
    end.
    0 0
  • 小旋风柴进
    2019-07-17 22:49:30
    标准库里就有的,另外如果有特殊要求的话,找找这方面的库,应该不少
    其实讲效率的,就是直接用库,自己学会恰当的调用就行了,呵呵,写这些库的人,都是这方面的专家,当然你自娱自乐又是别论了。
    0 0
  • 青衫无名
    2019-07-17 22:49:30
    c语言中排序法有选择法和冒泡法是最常见的。
    1冒泡法对10个数排序
    #include<stdio.h>
    void main ()
    { int a[10];
    int i,j,t;
    printf("please input 10 numbers:\n");
    for(i=0;i<10;i++)
    scanf("%d",&a[i]);
    printf("\n");
    for(j=0;j<9;j++) //进行9次循环,实现9次比较
    for(i=0;i<9-j;j++) //在每一次比较中在进行9-j次比较
    if(a[i]>a[i+1]) //相邻两数比较大的下沉即交换
    {t=a[i+1];
    a[i+1]=a[i];
    a[i]=t;
    }
    printf("the sorted numbers :\n");
    for(i=0;i<10;i++)
    printf("%d",a[i]);
    printf("\n");
    }
    不管有多少数只要改变一下都可以实现功能。定义一个大的数组,用多次循环就可以实现。
    2选择法对10个数排序
    此法没有冒泡法方便不在叙述 。
    0 0
添加回答
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

相似问题
最新问题