比赛的时候有一道题,解题的时候我本来想用结构体数组存变量,然后对结构体数组中的其中一个量进行排序,但是当时不会自己编写对结构体的快排的cmp函数,只会写对一般数组进行排序的cmp,于是用的另一种方法,刚研究了下对结构体排序。
同学用c++写了一个cmp函数对那个结构体数组进行排序,还是用的sort,他说要看看stl的话对那个会理解一点,可是那个好多呀,于是我看了c语言的快排,希望把这个快排改编以下,以便对结构体排序
对普通数组排序的快排代码如下
思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,
然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。下面代码详细讲。
参考处:http://blog.sina.com.cn/s/blog_70441c8e0100pxuh.html
#include <stdio.h> void quiksort(int a[],int low,int high) { int i = low; int j = high; int temp = a[i]; if( low < high) { while(i < j) { while((a[j] >= temp) && (i < j)) { j--; } a[i] = a[j]; while((a[i] <= temp) && (i < j)) { i++; } a[j]= a[i]; } a[i] = temp; quiksort(a,low,i-1); quiksort(a,j+1,high); } else { return; } } int main() { int arry[5] = {23,1,21,4,19}; quiksort(arry,0,4); for(int i=0;i<5;i++) { printf("%d ",arry[i]); } printf(" "); }
下面是我测试快排方法的代码,大概就是
从后往前依次寻找比a[0]小的数,把这个数赋给前面曾经找到并记住的的比a[0]大的数的位置上
从前往后依次寻找比a[0]大的数,把这个数赋给后面曾经找到并记住的的比a[0]小的数的位置上
第一次也不用担心,第一次是从后往前找,所以是把先找到的那个数赋到原a[0]的位置了
直到两边找到的数撞上
这时候把原来的a[0]赋给撞上的那个数
最后 quiksort(a,low,i-1); quiksort(a,j+1,high);即对分开的两部分再排序。
#include <stdio.h> void quiksort(int a[],int low,int high) { int i = low; int j = high; int temp = a[i]; if( low < high) { while(i < j) { while((a[j] >= temp) && (i < j)) { j--; printf("j = %d ", j); } a[i] = a[j]; printf("a[i] = %d ", a[i]); for(int k = 0; k < 7; k++) printf("%d ", a[k]); printf(" "); while((a[i] <= temp) && (i < j)) { i++; printf("i = %d ", i); } a[j]= a[i]; for(int k = 0; k < 7; k++) printf("%d ", a[k]); printf(" "); printf("a[j] = %d ", a[j]); } a[i] = temp; quiksort(a,low,i-1); quiksort(a,j+1,high); } else { return; } } int main() { int arr[7] = {49, 38, 65, 97, 76, 13, 27}; for(int i = 0; i < 7; i++) printf("%d ", arr[i]); printf(" "); quiksort(arr,0,6); for(int i=0;i<7;i++) { printf("%d ",arr[i]); } printf(" "); }
下面是他的那道题的代码,等我能看懂的时候再看,题目出处
#include <algorithm> #include <stdio.h> #include <stdlib.h> #include <string.h> using namespace std; struct ss { int a; int b; }time[20020]; int cnt[20010]; int cmp(const ss &c,const ss &d) { return c.a<d.a; } int cmp2(const void *x, const void *y) { return *(int *)x - *(int *)y; } int main() { int t,n,l,i,cnt1,cnt2,ans,hr,mi,sec; scanf("%d",&t); while(t--) { memset(cnt,0,sizeof(cnt)); memset(time,0,sizeof(ss)); scanf("%d%d",&n,&l); for(i=1;i<=n;i++) { scanf("%d:%d:%d",&hr,&mi,&sec); time[i].a = hr*3600 + mi*60 + sec; time[i].b = i; } sort(time+1,time+n+1,cmp); cnt1 = 1; cnt2 = 2; ans = 1; cnt[0]=time[1].b; while(cnt2!=n+1) { if(time[cnt2].a-time[cnt1].a<l) { cnt2++; } else { cnt1 = cnt2++; cnt[ans++] = time[cnt1].b; } } qsort(cnt,ans,sizeof(cnt[0]),cmp2); printf("%d ",ans); for(i=0;i<ans-1;i++) printf("%d ",cnt[i]); printf("%d ",cnt[ans-1]); } return 0; }