排序

一、简单排序:冒泡排序  、选择排序  、直接选择排序

二、复杂排序:希尔排序  、直接插入排序

三、相关习题:hdu 1862 EXCLL排序 、 hdu 1236 排名、hdu 1009 FatMouse' Trade、hdu 1106 排序




一、简单排序


冒泡排序:

/*
author:何兆怡
time:2014-9-9,15:30
algorithm: 冒泡排序
*/
/*头文件*/
#include<stdio.h>
/*函数声明*/
void bubbleSort(int arr[],int n)//冒泡排序
{
    int i,j,t;
    for(i=0;i<n-1;i++)
    {
        for(j=0;j<n-i-1;j++)
        {
            if(arr[j]>arr[j+1])
            {
                t=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=t;
             }
        }
    }


}

void print(int arr[],int n)    //打印数组
{
    int i=0;
    for(;i<n;i++)
    {
        printf("%d  ",arr[i]);
    }
    printf("\n");
}
int main()
{
    int arr[]={6,2,5,3,9};    //测试数据
    print(arr,5);
    bubbleSort(arr,5);
        printf("排序后的结果:\n");
    print(arr,5);
    return 0;
}



选择排序 :

/*
 author:某某
 time:2014-9-7,8:00
 algorithm: 选择排序 
*/


/* 头文件 */
#include <stdio.h>


/* 常量初始化 */
#define MAXN 100


/* 函数声明 */
void selectSort (int *a,int n);//选择排序 


int main()
{
   int a[MAXN];//数组声明 
   int n;//一般用于个数 
   int i;//一般用于循环参量 
   /* 输入模块 */ 
   printf("个数:");
   scanf("%d",&n); 
   printf("输入%d个整数:\n",n);
   for(i=0;i<n;i++)
       scanf("%d",&a[i]);
       
   /* 处理模块 */ 
   selectSort(a,n);//函数调用
   
   /* 输出模块 */ 
   printf("升序排序如下:\n");
   for(i=0;i<n;i++)
       printf("%d ",a[i]);
   printf("\n");
   
   return 0; 
} 
/* 函数实现 */
void selectSort( int *a,int n)
{
/* 选择排序 */ 

int i,j;
int index,temp;
for(i=0;i<n-1;i++) //对n个记录进行n-1趟的简单选择排序
{

index=i; //初始化第i趟简单选择排序的最小记录指针
for(j=i+1;j<n;j++) //搜索关键字最小的记录位置
if(a[j]<a[i]) index=j;
if(index!=i)
{
temp=a[i];
a[i]=a[index];
a[index]=temp;
}
}
}



直接选择排序:

/*
  author:WangQiang
  time:2014-9-8,21:00
  algorithm:直接选择排序
*/
#include <stdio.h>
#define N 10
void main()
{
   int a[N],i,j,k,t,n=10;
   printf("Please input 10 number:");
   for(i=0;i<10;i++)
       scanf("%d",&a[i]);
   for(i=0;i<n-1;i++) //外循环控制趟数,n个数选n-1趟
   {
       k=i;   //假设当期趟的第一个数为最值,记在k中
       for(j=i+1;j<n;j++) //从下一个数到最后一个数之间找最值
           if(a[j]<a[k])  //若其后有比最值更大的
           k=j;  //则将其小标记在K中
       if(k!=i) //若k不为最初的i值,说明在其后找到比其更大的数
       {
           t=a[k];
           a[k]=a[i];
           a[i]=t;
       //则交换最值和当前序列的第一个数
       }
   }
   printf("The sorted numbers:");
   for(i=0;i<10;i++)
       printf("%d",a[i]);
   printf("\n");
}

二、复杂排序

 

希尔排序:

/*
 author:任梦茹
 time:2014-9-9,8:00
 algorithm: 希尔排序
*/


/* 头文件 */
#include <stdio.h>
/* 常量初始化 */
#define MAXN 100


/* 函数声明 */
void Shellsort(int *a,int n);//希尔排序


int main()
{
   int a[MAXN];//数组声明
   int n;//一般用于个数
   int i;//一般用于循环参量
   /* 输入模块 */
   printf("个数:");
   scanf("%d",&n);
   printf("输入%d个整数:\n",n);
   for(i=0;i<n;i++)
       scanf("%d",&a[i]);


   /* 处理模块 */
   Shellsort(a,n);//函数调用


   /* 输出模块 */
   printf("排序结果如下:\n");
   for(i=0;i<n;i++)
       printf("%d ",a[i]);
   printf("\n");


   return 0;
}
/* 函数实现 */
void Shellsort(int *a, int n)
    {
        int i, j, step;


        for (step = n / 2;step > 0; step/= 2)  //步长
            for (i = 0; i < step; i++)        //直接插入排序
            {
                for (j = i + step; j < n; j += step)
                    if (a[j] < a[j - step])  //(j-step)的值为i,即当a[j]<a[i]
                    {
                        int temp = a[j]; //将小的的值赋给temp
                        int k = j - step;  //k=j-step,即将i的值赋给k
                        while (k >= 0 && a[k] > temp)
                        {
                            a[k + step] = a[k];
                            k -= step;
                        }
                        a[k + step] = temp;
                    }
            }
    }


 直接插入排序:

/*
 author:许艳峰
 time:2014-9-8,15:40
 algorithm: 直接插入排序
*/
/*头文件*/
#include <stdio.h>
/* 常量初始化 */
#define MAXN 100
/* 函数声明 */
void insertDirectSort(int *a, int n);//直接插入排序


int main()
{
    int a[MAXN];
    int i,j;
int num,n;
/* 输入模块 */
    printf("please input a number N:");
    scanf("%d",&n);


    printf("please input the original:\n");
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
    /* 处理模块 */
    insertDirectSort(a,n);//升序排序
     /* 输出模块 */
    printf("output the sorted original:\n");
    for(i=1;i<=n;i++)
        printf("%d ",a[i]);
    printf("\n");


    return 0;
}
/* 函数实现 */
void insertDirectSort(int *a, int n)
{
    /* 直接插入排序 */
int i,j;
for(i=2;i<=n;i++)
{
if(a[i]<a[i-1])//将a[i]插入待排记录中
{
a[0]=a[i];//复制哨兵
a[i]=a[i-1];
for(j=i-2;a[0]<a[j];--j)
{
a[j+1]=a[j];//记录后移
}
a[j+1]=a[0];//插入到正确的位置
}
}
}


三、相关习题


hdu 1862 EXCLL 排序

#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
struct student
{
    char id[10];
    char name[12];
    int score;
}stu[100005];
int cmp1(const void *a,const void *b)
{  //按学号排序
    student* ta=(student *)a;
    student* tb=(student *)b;
    return strcmp(ta->id,tb->id);
}
int cmp2(const void *a,const void *b)
{   //按姓名排序
    student* ta=(student *)a;
    student* tb=(student *)b;
    if(strcmp(ta->name,tb->name)==0)
        return strcmp(ta->id,tb->id);
    return strcmp(ta->name,tb->name);
}
int cmp3(const void *a,const void *b)
{      //按成绩排序
    student* ta=(student *)a;
    student* tb=(student *)b;
    if(ta->score==tb->score)
        return strcmp(ta->id,tb->id);
    return ta->score-tb->score;
}
int main()
{
    int n,c;
    int i,j;
    int cases=1;
    while(cin>>n>>c && n)
        {
        for(i=0;i<n;i++)
            cin>>stu[i].id>>stu[i].name>>stu[i].score;
        cout<<"Case "<<cases<<":"<<endl;
        if(c==1)
        {
            qsort(stu,n,sizeof(student),cmp1);
            for(i=0;i<n;i++)
                cout<<stu[i].id<<" "<<stu[i].name<<" "<<stu[i].score<<endl;
        }else if(c==2)
        {
            qsort(stu,n,sizeof(student),cmp2);
            for(i=0;i<n;i++)
                cout<<stu[i].id<<" "<<stu[i].name<<" "<<stu[i].score<<endl;
        }else
        {
            qsort(stu,n,sizeof(student),cmp3);
            for(i=0;i<n;i++)
                cout<<stu[i].id<<" "<<stu[i].name<<" "<<stu[i].score<<endl;
        }
        cases++;
    }
    return 0;
}



hdu 1236 排名

#include <iostream>  
#include <cstdio>  
#include <cstring>  
#include <algorithm>  
using namespace std;  
#define N 1005  
int que[15];  
  
struct node  
{  
    char name[25];  
    int num;  
    int sum;  
} stu[N];  
  
bool cmp(const node &a,const node &b)  
{  
    if(a.sum == b.sum)  
        return strcmp(a.name,b.name) < 0 ? 1 : 0;  
    else  
        return a.sum > b.sum;  
}  
  
int main()  
{  
    int stu_num,text_num,line,a,cnt;  
  
    while(scanf("%d",&stu_num)!=EOF && stu_num)  
    {  
        cnt = 0;  
        int i;  
        scanf("%d%d",&text_num,&line);  
        for(i = 1; i<=text_num; i++)  
            scanf("%d",&que[i]);  
        for(i = 1; i<=stu_num; i++)  
        {  
            stu[i].sum = 0;  
            scanf("%s%d",stu[i].name,&stu[i].num);  
            while(stu[i].num--)  
            {  
                scanf("%d",&a);  
                stu[i].sum+=que[a];  
            }  
            if(stu[i].sum>=line)  
                cnt++;  
        }  
        sort(stu+1,stu+1+stu_num,cmp);  
        cout << cnt << endl;  
        for(i = 1; i<=stu_num; i++)  
        {  
            if(stu[i].sum >=line)  
                printf("%s %d\n",stu[i].name,stu[i].sum);  
            else  
                break;  
        }  
    }  
    return 0;  
}  



hdu 1009 FatMouse' Trade

#include<algorithm>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
const int Maxn=10000;


struct Node
{
    double j,f;
    double r;
}a[Maxn];


bool cmp(Node a,Node b)
{
    return a.r>b.r;
}


int main()
{
    int N;
    double M;
    double ans;
    while(scanf("%lf%d",&M,&N))
    {
        if(M==-1&&N==-1) break;
        for(int i=0;i<N;i++)
        {
            scanf("%lf%lf",&a[i].j,&a[i].f);
            a[i].r=(double)a[i].j/a[i].f;
        }
        sort(a,a+N,cmp);
        ans=0;
        for(int i=0;i<N;i++)
        {
            if(M>a[i].f)
            {
                ans+=a[i].j;
                M-=a[i].f;
            }
            else
            {
                ans+=(a[i].j/a[i].f)*M;
                break;
            }
        }
        printf("%.3lf\n",ans);
    }
    return 0;


}



hdu 1106 排序

//快排与atoi函数的运用  
#include <iostream>  
#include <cstdio>  
#include <cstring>  
#include <stdlib.h>  
using namespace std;  
  
char str[10005],p[10005];  
int num[10005];  
  
int cmp(const void *a,const void *b)  
{  
    return (*(int*)a - *(int*)b);  
}  
  
int main()  
{  
    while(gets(str))  
    {  
        int j = 0,k = 0,i,len;  
        len = strlen(str);  
        str[len] = '5';  
        str[++len] = '\0';  
        for(i = 0;i<len;i++)  
        {  
            if(str[i] != '5')  
            p[j++] = str[i];  
            else if(str[i-1]!='5' && i>0)// 对于是5的位置还需要检查前一个字符是不是5,如果前一个字符已经是5,则表明这是多余的5。  
            {  
                p[j] = '\0';  
                num[k++] = atoi(p);  
                j = 0;  
            }  
        }  
        qsort(num,k,sizeof(int),cmp);  
        for(i = 0;i<k-1;i++)  
        cout << num[i] << " ";  
        cout << num[i] << endl;  
    }  
  
    return 0;  
}  





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值