很久没写c语言代码了,回顾一下,写了基于快速排序的字符串排序。
c语言定义二维 数组的方式:
char s[10][20]; 正常的数组
char *s[20]; 指针数组,需要逐一申请空间,s[i] = malloc(…),s[i]指向的是一个地址
快速排序思想:
选择基准p,i<j,从左边找一个s[i]>p,从右边找一个s[j]<p,交换s[i],s[j];
基准与此时的s[i]交换;
此时,中间的值已经排好序,对两边进行递归快速排序,直到排序结束,即i>=j
#include<stdio.h>
#include<stdlib.h>
//声明函数
void qsort(char *lineptr[],int left,int right);
void swap(char *v[],int i,int j);
int strcmp(char *s,char *w);
int main()
{
// int a[10][20]; //a[i][j] 20*row+col
// int *b[10]; //指针数组,b[i]指向一个地址,b[i] 要初始化
// int size = 20;
//
// for(int i=0;i<10;i++){
// int *p = (int*)malloc(sizeof(int)*size);
// b[i] = p;
// }
//
// for(int i=0;i<10;i++)
// free(b[i]);
//二维数组
char *s[] = {"Illegal month","Jan","Feb","Mar","Apil"}; //char s[][20]
for(int i=0;i<5;i++)
printf("%s\n",s[i]);
qsort(s,0,4);
printf("排序后:\n");
for(int i=0;i<5;i++)
printf("%s\n",s[i]);
return 0;
}
void qsort(char *lineptr[],int left,int right){
if(left>=right)
return;
int i = left+1;
int j = right;
char *p = lineptr[left];
for(;i<j;){
while(strcmp(lineptr[i],p)<=0 && i<j){
i++;
}
while(strcmp(lineptr[j],p)>=0 && i<j){
j--;
}
swap(lineptr,i,j);
}
swap(lineptr,left,i);
qsort(lineptr,left,i-1);
qsort(lineptr,i+1,right);
}
int strcmp(char *s,char *w){
for(;*s==*w; s++,w++){
if(*s == '\0')
return 0;
}
return *s -*w;
}
void swap(char *v[],int i,int j){
char* temp = v[i];
v[i] = v[j];
v[j] = temp;
}