lib C函数

函数1:qsort函数

http://www.cnblogs.com/sooner/archive/2012/04/18/2455011.html

No.1、手工实现QuickSort:

基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

#include
#include
void QuickSort(int *A,int left,int right)
{
    if(left>=right) return;
    int x=A[(left+right)>>1],low=left,high=right;
    while(lowx)
            high--;
        if(low<=high)
        {
            int Temp=A[low];
            A[low]=A[high];
            A[high]=Temp;
            low++;
            high--;
        }
    }
    QuickSort(A,left,high);
    QuickSort(A,low,right);
}
int main()
{
    int length,i,r[10000];
    scanf("%d",&length);
    for(i=1;i<=length;i++)
        scanf("%d",&r[i]);
    QuickSort(r,1,length);
    for(i=1;i<=length;i++)
        printf(" %d",r[i]);
    printf("\n");
    system("pause");
    return 0;
}
或者:

#include
#include
int QKPass(int r[],int left,int right)
{
    int low,high,x;
    x=r[left];//选择基准记录
    low=left;
    high=right;
    while(low=x)//从右到左找到小于x的记录
            high--;
        if(low


No.2、最常见的,对int数组排序 :

#include 
#include
int s[10000],n,i;
int cmp(const void *a, const void *b) 
{ 
     return(*(int *)a-*(int *)b);  //升序 
     //return(*(int *)b-*(int *)a); //降序 
}
int main() 
{ 
     scanf("%d",&n); 
     for(i=0;i


No.3、对double型数组排序,原理同int:


这里做个注释,本来是因为要判断如果a==b返回0的,但是严格来说,两个double数是不可能相等的,只能说fabs(a-b)<1e-20之类的这样来判断,所以这里只返回了1和-1 
#include 
#include
double s[1000]; 
int i,n;
int cmp(const void * a, const void * b) 
{ 
     return((*(double*)a-*(double*)b>0)?1:-1); 
}

int main() 
{ 
     scanf("%d",&n); 
     for(i=0;i


No.4、对一个字符数组排序.原理同int:

#include 
#include 
#include
char s[10000],i,n;
int cmp(const void *a,const void *b) 
{ 
     return(*(char *)a-*(char *)b); 
}
int main() 
{ 
     scanf("%s",s); 
     n=strlen(s); 
     qsort(s,n,sizeof(s[0]),cmp);     
     printf("%s",s); 
     printf("\n");
     system("pause");
     return 0; 
}


No.5、对结构体排序(一级排序):

很多时候我们都会对结构体排序,比如2010年校赛的那个根据几个参数排序,一般这个时候都在cmp函数里面先强制转换了类型,不要在return里面转换,我也说不清为什么,但是这样程序会更清晰,并且绝对是没错的。 这里同样请注意double返回0的问题:

#include 
#include
struct node 
{ 
     double data; 
     int no; 
} s[100];
int i,n;
int cmp(const void *a,const void *b) 
{ 
     struct node *aa=(node *)a; 
     struct node *bb=(node *)b; 
     return(((aa->data)>(bb->data))?1:-1); 
}
int main() 
{ 
     scanf("%d",&n); 
     for(i=0;i


No.6、对结构体排序(二级排序)。

加入no来使其稳定(即data值相等的情况下按原来的顺序排):

#include 
#include
struct node 
{ 
     double data; 
     int no; 
} s[100];

int i,n;
int cmp(const void *a,const void *b) 
{ 
     struct node *aa=(node *)a; 
     struct node *bb=(node *)b; 
     if(aa->data!=bb->data) 
         return(((aa->data)>(bb->data))?1:-1); 
     else 
         return((aa->no)-(bb->no)); 
}
int main() 
{ 
     scanf("%d",&n); 
     for(i=0;i
如果有字符串的话,就这样写:
int cmp(const void *a,const void *b) 
{ 
     struct node *aa=(node *)a; 
     struct node *bb=(node *)b; 
     if(aa->data!=bb->data) 
         return(((aa->data)>(bb->data))?1:-1); 
     else 
         return((aa->no)-(bb->no));
     else 
         return strcmp(aa.str,bb.str);
         //return strcmp(aa->str,bb->str);
         //按照结构体中字符串str的字典顺序排序
}


No.7、对字符串数组的排序(char s[][]型):


#include 
#include 
#include
char s[100][100]; 
int i,n;
int cmp(const void *a,const void *b) 
{ 
     return(strcmp((char*)a,(char*)b)); 
}
int main() 
{ 
     scanf("%d",&n); 
     for(i=0;i


No.8、对字符串数组排序(char *s[]型):

#include 
#include 
#include
char *s[100]; 
int i,n;
int cmp(const void *a,const void *b)
{ 
     return(strcmp(*(char**)a,*(char**)b)); 
}
int main() 
{ 
     scanf("%d",&n); 
     for(i=0;i



char *s = (char *)malloc(n);//其中n为要开辟空间的大小
char s[n];定义的也是一个指向数组的指针,便可进行数组的下标操作。


char s[10]="hello";
s[0] s[1]等都是char
&s[0]等同于s,是char*类型,


形式  类型    等价于   cout特殊处理
s        char*  &s[0]       hello
s+1    char*  &s[0]+1   ello
*s      char   s[0]          h 
&s                              0x0012FF78
s[0]    char                 h
s[1]    char                 e
&s[0]  char*               hello
&s[1] char*               ello


 
char s2[10][20];
s2[0] s2[1]等都是char[20]
&s2[0]等同于s2,是char[20]类型,也就相当于char*类型,


char*s2[10];
s2[0] s2[1]等都是char*
*s2[0] *s2[1]等都是char,是s2[0] s2[1]指向的字符串的第一个字符
s2是char**,等同于&s2[0]


你可能感兴趣的:(linux)