lib C函數__函數

來源:互聯網
上載者:User
函數1:qsort函數

http://www.cnblogs.com/sooner/archive/2012/04/18/2455011.html
No.1、手工實現QuickSort:

基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。

#include<stdio.h>#include<stdlib.h>void QuickSort(int *A,int left,int right){    if(left>=right) return;    int x=A[(left+right)>>1],low=left,high=right;    while(low<high)    {        while(A[low]<x)            low++;        while(A[high]>x)            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<stdio.h>#include<stdlib.h>int QKPass(int r[],int left,int right){    int low,high,x;    x=r[left];//選擇基準記錄    low=left;    high=right;    while(low<high)    {        while(low<high&&r[high]>=x)//從右至左找到小於x的記錄            high--;        if(low<high)        {            r[low]=r[high];//找到後進行替換            low++;        }        while(low<high&&r[low]<x)        {            low++;        }        if(low<high)        {            r[high]=r[low];            high--;        }        r[low]=x;//將基準記錄儲存在low=high的位置        return low;//返回基準記錄的位置    }}int QKSort(int r[],int low,int high){    int pos;    if(low<high)    {        pos=QKPass(r,low,high);        QKSort(r,low,pos-1);        QKSort(r,pos+1,high);    }}int main(){    int length,i,r[10000];    scanf("%d",&length);    for(i=1;i<=length;i++)        scanf("%d",&r[i]);    QKSort(r,1,length);    for(i=1;i<=length;i++)        printf("%-3d",r[i]);    printf("\n");    system("pause");    return 0;}


No.2、最常見的,對int數組排序 :

#include<stdio.h> #include<stdlib.h>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<n;i++)         scanf("%d",&s[i]);      qsort(s,n,sizeof(s[0]),cmp);          for(i=0;i<n;i++)        printf("%d ",s[i]);     printf("\n");     system("pause");     return 0; }


No.3、對double型數組排序,原理同int:
這裡做個注釋,本來是因為要判斷如果a==b返回0的,但是嚴格來說,兩個double數是不可能相等的,只能說fabs(a-b)<1e-20之類的這樣來判斷,所以這裡只返回了1和-1 

#include<stdio.h> #include<stdlib.h>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<n;i++)        scanf("%lf",&s[i]);          qsort(s,n,sizeof(s[0]),cmp);          for(i=0;i<n;i++)        printf("%.2lf ",s[i]);      printf("\n");     system("pause");        return(0); }


No.4、對一個字元數組排序.原理同int:

#include<stdio.h> #include<string.h> #include<stdlib.h>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<stdio.h> #include<stdlib.h>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<n;i++)      {          s[i].no=i+1;          scanf("%lf",&s[i].data);      }      qsort(s,n,sizeof(s[0]),cmp);          for(i=0;i<n;i++)         printf("%d %lf\n",s[i].no,s[i].data);      system("pause");     return 0; }


No.6、對結構體排序(二級排序)。

加入no來使其穩定(即data值相等的情況下按原來的順序排):

#include<stdio.h> #include<stdlib.h>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<n;i++)      {          s[i].no=i+1;          scanf("%lf",&s[i].data);      }      qsort(s,n,sizeof(s[0]),cmp);     for(i=0;i<n;i++)         printf("%d %lf\n",s[i].no,s[i].data);     printf("\n");     system("pause");     return 0; }
如果有字串的話,就這樣寫:
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<stdio.h> #include<string.h> #include<stdlib.h>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<n;i++)        scanf("%s",s[i]);     qsort(s,n,sizeof(s[0]),cmp);       for(i=0;i<n;i++)        printf("%s\n",s[i]);      printf("\n");     system("pause");     return 0; }


No.8、對字串數組排序(char *s[]型):

#include<stdio.h> #include<string.h> #include<stdlib.h>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<n;i++)      {          s[i]=(char*)malloc(sizeof(char*));          scanf("%s",s[i]);      }     qsort(s,n,sizeof(s[0]),cmp);     for(i=0;i<n;i++)         printf("%s\n",s[i]);     printf("\n");     system("pause");     return 0; }



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]


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.