一、简单排序:冒泡排序 、选择排序 、直接选择排序
二、复杂排序:希尔排序 、直接插入排序
三、相关习题: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;
}