开发者社区 问答 正文

C语言排序算法一共多少种

一共有多少种,列举一下,各种算法,最好有实例

展开
收起
知与谁同 2018-07-15 09:49:31 3077 分享 版权
1 条回答
写回答
取消 提交回答
  • 胜天半子

    选择排序
    #include <iostream>
    using namespace std;
    void select_sort(int arr[], int num);
    void output_array(int arr[], int num);
    int main()
    {
        int a[10];
        for(int i=0; i<10; i++)
        {
            cin>>a[i];
        }
        select_sort(a,10);
        output_array(a,10);
        return 0;
    }
    void select_sort(int array[],int n) //形参array是数组名
    {
        int i,j,k,t;
        for(i=0; i<n-1; i++)
        {
            k=i;  //先设第i个就为最小
            for(j=i+1; j<n; j++)
                if(array[j]<array[k])
                    k=j;   //通过循环,得到k为最小
            t=array[k];    //交换a[i]和a[k]
            array[k]=array[i];
            array[i]=t;
        }
        return;
    }
    void output_array(int arr[], int num)
    {
        int i;
        for(i=0; i<num; i++)
        {
            cout<<arr[i];
            cout<<endl;
        }
        return;
    }

    2.冒泡排序
    #include<stdio.h>
    int main()
    {
    int i,j,a[10],t;
    for(i=0;i<10;i++)
    scanf("%d",&a[i]);
    for(i=0;i<10;i++)
    for(j=i+1;j<10;j++)
    if(a[i]>a[j])
    {
    t=a[j];
    a[j]=a[i];
    a[i]=t;
    }
    for(i=0;i<10;i++)
    printf("%d ",a[i]);
    return 0;
    }

    3.堆排序 #include<iostream>
    using namespace std;
    void  paidui(int a[20],int i,int m)
    {
    int k,t;    
    t=a[i]; 
    k=2*i+1;    
    while (k<m)    
    {        
    if ((k<m-1)&&(a[k]<a[k+1])) 
    k++;   
    if (t<a[k]) 
    {
    a[i]=a[k]; 
    i=k; 
    k=2*i+1;
    }        
    else break; 
    }    
    a[i]=t;
    }
    void duipai(int a[20], int n)  
    {
    int i,k; 
    for (i=n/2-1;i>=0;i--) 
    paidui(a,i,n);     
    for (i=n-1; i>=1; i--)    
    {  
    k=a[0]; 
    a[0]=a[i]; 
    a[i]=k;  
    paidui(a,0,i);    
    }}
    int main() 
    {  
    int a[10],i; 
    for(i=0;i<10;i++)  
    cin>>a[i];
    duipai(a,10); 
    for(i=0;i<10;i++)
    cout<<a[i]<<endl;
    }

    4.快速排序
    #include<iostream>
    using namespace std;
    void Quicksort(int a[],int low,int high)
    {
        if(low>=high)
        {
            return;
        }
        int first=low;
        int last=high;
        int key=a[first];
        while(first<last)
        {
    while(first<last&&a[last]>=key)
                --last;
            a[first]=a[last];
            while(first<last&&a[first]<=key)
                ++first;
            a[last]=a[first];
    }
        a[first]=key;
        Quicksort(a,low,first-1);
        Quicksort(a,last+1,high);
    }


    int main()
    {
        int i,a[100],x,n=0;
    while(cin>>x)
    {
    a[n]=x;
    n++;
    }
    n--;
    Quicksort(a,0,n);
    for(i=0;i<=n;i++)
    cout<<a[i]<<" ";
    cout<<endl;
        return 0;
    }

    5. 基数排序 #include <stdio.h>
    #include <stdlib.h>
    int main(){
    int data[10]={73,22,93,43,55,14,82,65,39,81};        //对十个数进行排序
    int temp[10][10]={0};        //构造一个临时二维数组,其值为0
    int order[10]={0};        //构造一维数组,其值为0
    int i,j,k,n,lsd;
    k=0;n=1;
    for (i=0;i<10;i++) printf("%d ",data[i]);         //在排序前,对这10个数打印一遍
    putchar('\n');
    while (n<=10){
    for (i=0;i<10;i++){
    lsd=((data[i]/n)%10);         //lsd先对个位取余,然后再对十位取余,注意循环
    temp[lsd][order[lsd]]=data[i];        //temp[3][0]=73,temp[2][0]=22,temp[3][1]=93,temp[3][2]=43,⋯⋯
    order[lsd]++;        //需要区分的是lsd和order[lsd],这两个不是一样的概念嗷
    }
    printf("\n重新排列: ");
    for (i=0;i<10;i++){
    if(order[i]!=0)
    for (j=0;j<order[i];j++){


    data[k]=temp[i][j];
    printf("%d ",data[k]);
    k++;
    }
    order[i]=0;
    }
    n*=10; //第二次用十位
    k=0;
    }
    putchar('\n');
    printf("\n排序后: ");
    for (i=0;i<10;i++) printf("%d ",data[i]);
    return 0;
    }

    6.希尔排序
    #include<iostream>
    using namespace std;
    void shell_sort(int a[],int n);
    int main()
    {
        int n,a[10000];
        cin>>n;
        for(int y=0;y<n;y++)
            cin>>a[y];
        shell_sort(a, n);
          for(int i=0; i<n; i++)
              cout<<a[i]<<" ";
          cout<<endl;
    }

    void shell_sort(int a[], int n)
    {
        int gap,k,temp;//定义增量;
        for(gap = 3; gap >0; gap--)//设置初始增量,递减;
        {
            for(int i=0; i<gap; i++)//按增量分组;
            {
                for(int j = i+gap; j<n; j=j+gap)//每组分别比较大小;
                {
                    if(a[j]<a[j-gap])
                    {
                        temp = a[j];
                        k = j-gap;
    while(k>=0&&a[k]>temp)
                        {
                            a[k+gap] = a[k];
                            k = k-gap;
                        } 

                       a[k+gap] = temp;
                    }
                }
            }
        }
    }

    7.归并排序
    #include<iostream>
    using namespace std;
    void MergeSort(int p[],int s,int m,int t)
    {
         int q[100];                        //q[100]用来存放排好的序列
     int i=s;
     int j=m+1;
     int k=s;
    while(i<=m&&j<=t)
     {
     if(p[i]<=p[j])
     q[k++]=p[i++];
     else
     q[k++]=p[j++];
     }
     if(i<=m)
     while(i<=m)
     q[k++]=p[i++];
     else while(j<=t)
     q[k++]=p[j++];
     for(int n=s;n<=t;n++)
                 p[n]=q[n];
    }
     void Merge(int p[],int s,int t)
     {
     if(s<t)
     {
     int m=(s+t)/2;  //将数组分成两半
     Merge(p,s,m);//递归拆分左数组
     Merge(p,m+1,t);//递归拆分右数组
     MergeSort(p,s,m,t);//合并数组
         }
     }
     int main()
     {
         int n;
     int p[100];
     cin>>n;
      for(int i=0; i<n; i++)
             cin>>p[i];
     Merge(p,0,n-1);
     for(int j=0;j<n;j++)
     cout<<p[j]<<" ";
     cout<<endl;
     return 0;
     }

    排序方法基本就这些,还有双向冒泡这种拓展的排序方法,还有直接排序如桶排序

    2019-07-17 22:49:27
    赞同 展开评论
问答分类:
问答地址: