一:题外话
今天是2016年6月13日,我准备开始练习计算机机试题了,作为一个普通一本,没过六级,但还是想去北京读书的普通大学生,我还是选择努力的挣扎一下。(虽然感觉有夏令营资格的可能性都不算大)。于是买了一本王道论坛出的《计算机考研机试指南》,最近才知道9度OJ凉凉了,对此表示真的是巨可惜,不过书还是好书,因此我将以这本书来进行准备。
回想我大学的编程之路,自从大一申请参加学校的acm实验室失败之后,我对算法编程题便有了一种恐惧,感觉自己没有那些能进实验室的人聪明。其实事实的确如此,身边不乏有许多在编程上有天分的同学存在,他们就有那种对解题方法敏锐的嗅觉。不过我也相信事在人为,我不追求变成一个acmer,但是也应该好好努力,掌握基础的知识,至少如果有机会参加夏令营,我希望我可以取点分。。。
二:正式开始:排序
1,冒泡排序:
#include <stdio.h> #include <stdlib.h> int main() { int n; int buf[100]; int i=0,j=0; while(scanf("%d", &n) != EOF) { for (i=0; i<n; i++) { scanf("%d", &buf[i]); } for(i=0; i<n; i++) { for(j=0; j<n-1-i; j++) { if(buf[j] > buf[j+1]) { int temp = buf[j]; buf[j] = buf[j+1]; buf[j+1] = temp; } } } for(i=0; i<n; i++) { printf("%d ", buf[i]); } printf("\n"); } }
1).好久没写过C的代码了,我只能说难受。这个是基础的入门程序,从这个程序中,要注意的就是读入数据的方式:
while(scanf("%d",&n)!=EOF) 回想大一的时候看见这个东西都要懵逼半天。
2).当输入的是字符串,并且读的方式使用得是gets()方式的时候,相同功能的循环判断语句改为while(gets(字符串变量))
3).冒泡排序的思想就是两两交换,每一轮都将最大的交换到后面。因此两个循环的条件就很好理解了。
4).要注意算法的复杂度问题,冒泡排序的复杂度是O(N^2),因此比如n的范围是10000的时候,就不能使用冒泡排序了。
2.C++写好的排序函数:
#include<stdio.h> #include<algorithm> using namespace std; int main() { int n; int buf[10000]; while(scanf("%d", &n)!=EOF) { for(int i=0; i<n; i++) { scanf("%d", &buf[i]); } sort(buf, buf+n);//使用了sort的一个重载函数 for(int i=0; i<n; i++) { printf("%d ", buf[i]); } printf("\n"); } }
1).头文件要包含<algorithm>。 注意这里还是使用的<stdio.h>头文件,这样可以使用scanf读入。
2)sort函数的两个参数表示排序数组的起始地址和终止地址。默认是升序排序。
3.C++ sort函数的重载(实现降序)
#include<stdio.h> #include<algorithm> using namespace std; bool cmp(int x, int y) { return x>y; } int main() { int n; int buf[10000]; while(scanf("%d", &n)!=EOF) { for(int i=0; i<n; i++) { scanf("%d", &buf[i]); } sort(buf, buf+n, cmp);//使用了sort的一个重载函数 for(int i=0; i<n; i++) { printf("%d ", buf[i]); } printf("\n"); } }
可以看到这里只是定义了一个bool类型的cmp函数,只是规定了里面排序规则。这里大于是降序。
4.c语言qsort函数:
c语言也有快排函数,qsort。
#include <stdio.h> #include <stdlib.h> //整型升序排序 int cmpInt(const void*a, const void*b) { return *(int *)a - *(int *)b; } //整型降序排序 int cmpInt1(const void*a, const void*b) { return *(int *)b - *(int *)a; } // int main() { int n; int buf[100]; int i=0,j=0; while(scanf("%d", &n) != EOF) { for (i=0; i<n; i++) { scanf("%d", &buf[i]); } qsort(buf, n, sizeof(buf[0]), cmpInt1); for(i=0; i<n; i++) { printf("%d ", buf[i]); } printf("\n"); } }
可以看出qsort使用方法于sort有相似地方,都需要自定义一个比较函数。关于qsort,还可以比较字符串数组和结构体数组,可以参考这篇博客:https://blog.csdn.net/stpeace/article/details/9017113