第一节、桶排
p4 桶排的常见程序,从小到大,10以内
#include <stdio.h> int main() { int a[11],i,j,t; for(i=0;i<=10;i++) a[i]=0; //初始化为0 for(i=1;i<=5;i++) //循环读入5个数 { scanf("%d",&t); //把每一个数读到变量t中 a[t]++; //进行计数 } for(i=0;i<=10;i++) //依次判断a[0]~a[10] for(j=1;j<=a[i];j++) //出现了几次就打印几次 printf("%d ",i); getchar();getchar(); //这里的getchar();用来暂停程序,以便查看程序输出的内容 //也可以用system("pause");等来代替 return 0; } // 5 3 5 2 8
p6 桶排,从大到小,1000以内
1 #include <stdio.h> 2 int main() 3 { 4 int book[1001],i,j,t,n; 5 for(i=0;i<=1000;i++) 6 book[i]=0; 7 scanf("%d",&n);//输入一个数n,表示接下来有n个数 8 for(i=1;i<=n;i++)//循环读入n个数,并进行桶排序 9 { 10 scanf("%d",&t); //把每一个数读到变量t中 11 book[t]++; //进行计数,对编号为t的桶放一个小旗子 12 } 13 for(i=1000;i>=0;i--) //依次判断编号1000~0的桶 14 for(j=1;j<=book[i];j++) //出现了几次就将桶的编号打印几次 15 printf("%d ",i); 16 17 getchar();getchar(); 18 return 0; 19 } 20 /* 21 22 10 23 8 100 50 22 15 6 1 1000 999 0 24 25 */
第二节、冒泡排序
p9 冒泡常见排序 升序
#include <stdio.h> int main() { int a[100],i,j,t,n; scanf("%d",&n); //输入一个数n,表示接下来有n个数 for(i=1;i<=n;i++) //循环读入n个数到数组a中 scanf("%d",&a[i]); //冒泡排序的核心部分 for(i=1;i<=n-1;i++) //n个数排序,只用进行n-1趟 { for(j=1;j<=n-i;j++) //从第1位开始比较直到最后一个尚未归位的数,想一想为什么到n-i就可以了。 { if(a[j]>a[j+1]) //升序:从小到大。书里'<',搞错了 { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } } for(i=1;i<=n;i++) //输出结果 printf("%d ",a[i]); getchar();getchar(); return 0; } /* 10 8 100 50 22 15 6 1 1000 999 0 */
p10 由结构的一个成员大小,冒泡排序结构,降序
#include <stdio.h> struct student { char name[21]; char score; //xinle:这里的char,改成int可能更好 };//这里创建了一个结构体用来存储姓名和分数 int main() { struct student a[100],t; int i,j,n; scanf("%d",&n); //输入一个数n for(i=1;i<=n;i++) //循环读入n个人名和分数 scanf("%s %d",a[i].name,&a[i].score); //按分数从高到低进行排序 for(i=1;i<=n-1;i++) { for(j=1;j<=n-i;j++) { if(a[j].score<a[j+1].score)//对分数进行比较 { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } } for(i=1;i<=n;i++)//输出人名 printf("%s ",a[i].name); getchar();getchar(); return 0; } /* 5 huhu 5 haha 3 xixi 5 hengheng 2 gaoshou 8 */
第三节、快排
p18 常见快排程序
#include <stdio.h> int a[101],n;//定义全局变量,这两个变量需要在子函数中使用 void quicksort(int left,int right) { int i,j,t,temp; if(left>right) return; temp=a[left]; //temp中存的就是基准数 i=left; j=right; while(i!=j) { //顺序很重要,要先从右边开始找 while(a[j]>=temp && i<j) j--; //再找右边的 while(a[i]<=temp && i<j) i++; //交换两个数在数组中的位置 if(i<j) { t=a[i]; a[i]=a[j]; a[j]=t; } } //最终将基准数归位 a[left]=a[i]; a[i]=temp; quicksort(left,i-1); //继续处理左边的,这里是一个递归的过程 quicksort(i+1,right);//继续处理右边的 ,这里是一个递归的过程 } int main() { int i; //读入数据 scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&a[i]); quicksort(1,n); //快速排序调用 //输出排序后的结果 for(i=1;i<=n;i++) printf("%d ",a[i]); getchar();getchar(); return 0; } /* 10 6 1 2 7 9 3 4 5 10 8 */
第四节、小哼买书
p22 桶排用于去重,得心应手
#include <stdio.h> int main() { int a[1001],n,i,t; for(i=1;i<=1000;i++) a[i]=0; //初始化 scanf("%d",&n); //读入n for(i=1;i<=n;i++) //循环读入n个图书的ISBN号 { scanf("%d",&t); //把每一个ISBN号读到变量t中 a[t]=1; //标记出现过的ISBN号 } for(i=1;i<=1000;i++) //依次判断1~1000这个1000个桶 { if(a[i]==1)//如果这个ISBN号出现过则打印出来 printf("%d ",i); } getchar();getchar(); return 0; } /* 10 20 40 32 67 40 20 89 300 400 15 */
p23 用冒泡排序,解决去重
#include <stdio.h> int main() { int a[101],n,i,j,t; scanf("%d",&n); //读入n for(i=1;i<=n;i++) //循环读入n个图书ISBN号 { scanf("%d",&a[i]); } //开始冒泡排序 for(i=1;i<=n-1;i++) { for(j=1;j<=n-i;j++) { if(a[j]>a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } } printf("%d ",a[1]); //输出第1个数 for(i=2;i<=n;i++) //从2循环到n { if( a[i] != a[i-1] ) //如果当前这个数是第一次出现则输出 printf("%d ",a[i]); } getchar();getchar(); return 0; } /* 10 20 40 32 67 40 20 89 300 400 15 */
相关OJ:
小哼买书
http://www.tianchai.org/problem-12001.html
AC代码:
#include <stdio.h> int main() { int a[1001],n,i,t,sum; for(i=1;i<=1000;i++) a[i]=0; //初始化 scanf("%d",&n); //读入n for(i=1;i<=n;i++) //循环读入n个图书的ISBN号 { scanf("%d",&t); //把每一个ISBN号读到变量t中 a[t]=1; //标记出现过的ISBN号 } sum=0; for(i=1;i<=1000;i++) if(a[i]) sum++; //统计总数 printf("%d ",sum); //输出第一行 for(i=1;i<=1000;i++) //依次判断1~1000这个1000个桶 { if(a[i]==1)//如果这个ISBN号出现过则打印出来 printf("%d ",i); } //getchar();getchar(); return 0; } /* 10 20 40 32 67 40 20 89 300 400 15 */