C語言實現快速排序(完整版)DVE-C++編譯通過
阿新 • • 發佈:2019-02-09
#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;
}
#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;
}