1. 程式人生 > >C語言實現快速排序(完整版)DVE-C++編譯通過

C語言實現快速排序(完整版)DVE-C++編譯通過

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXLINES 5000  //進行排序的最大文字行

char *lineptr[MAXLINES];  //指向文字行的指標陣列

int readlines(char *lineptr[],int nlines);
void writelines(char *lineptr[],int nlines);
void qsort(char *lineptr[], int left,int right);

//對輸入的文字行進行排序
int main()
{
  int nlines;  //讀取輸入行數目
 
  if((nlines=readlines(lineptr,MAXLINES))>=0)
  {
      qsort(lineptr,0,nlines-1);
      writelines(lineptr,nlines);
      system("PAUSE");
      return 0;                            
  }
  else
  {
       printf("error:input too big to sort/n");
       system("PAUSE");
       return 1;
  }  

}

#define MAXLEN 1000 //每個輸入文字行的最大長度
int getline(char *,int);
char *alloc(int);

//readlines函式:讀取輸入行
int readlines(char *lineptr[],int maxlines)
{
    int len,nlines;
    char *p,line[MAXLEN];
   
    nlines=0;
    while((len=getline(line,MAXLEN))>0)
       if(nlines>=maxlines||(p=alloc(len))==NULL)
           return -1;
       else
          {
            line[len-1]='/0';  //刪除換行符 '/n'
            strcpy(p,line);
            lineptr[nlines++]=p;
            }
            return nlines;
}


//writeline函式:寫輸出行
void writelines(char *lineptr[],int nlines)
{
     int i;
    
     for(i=0;i<nlines;i++)
           printf("%s/n",lineptr[i]);
}

///getline:read a line into s,return length

 int getline(char s[],int lim)
   {
       int c, i;
       for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='/n'; ++i)
           s[i] = c;
       if (c == '/n') {
           s[i] = c;
           ++i;
       }
       s[i] = '/0';
       return i;
   }  
   
   
//alloc函式:返回指向N個字元的指標

#define ALLOCSIZE 5000  //可用空間大小
static char allocbuf[ALLOCSIZE];  //alloc使用的存貯區
static char *allocp=allocbuf;  //下一個空閒位置
 
char * alloc(int n)
{
     if(allocbuf+ALLOCSIZE-allocp>=n)  //有足夠的空閒空間
          {
            allocp+=n;
            return allocp-n; //分配當前指標
          }
      else     //空閒空間不夠     
           return 0;     
}

//qsort函式:按照遞增順序對V[left]....v[right]進行排序  二分排序法
/****void qsort(char *lineptr[],int left,int right);
int strcmp(const char *s1,const char * s2);
比較字串s1和s2。
  說明:
  當s1<s2時,返回值<0
  當s1=s2時,返回值=0
  當s1>s2時,返回值>0
********/
void qsort(char *v[],int left,int right)
{
     int i,last;
     void swap(char *v[],int i,int j);
    
     if(left>=right)  //如果陣列元素的個數小於2,則返回
        return ;
     swap(v,left,(left+right)/2);   //選(left+right)/2為基準,並和V[0]交換
     last=left;
     for(i=left+1;i<=right;i++)     //剩餘的元素和基準做比較
        if(strcmp(v[i],v[left])<0)  //把比基準小的元素依次排列在基準的後面
           swap(v,++last,i);
     swap(v,left,last);             //把最後一個比基準小的元素和基準交換,基準左邊的元素都是小於基準的,右邊的元素都是大於基準的
     qsort(v,left,last-1);      //對基準右邊的元素遞迴
     qsort(v,last+1,right);     //對基準右邊的元素遞迴
}    

//swap函式:交換V[I]和V[J]
void swap(char *v[],int i,int j)
{
     char *temp;
    
     temp=v[i];
     v[i]=v[j];
     v[j]=temp;
}