常用排序示例小结

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; 

 }

8.sort排序  Sort排序
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值