#include <stdio.h>
#include <stdlib.h>
typedef enum{ false = 0, true = 1 } bool;
//两个字符交换
void swap(char *a, char *b) {
char c = *a;
*a = *b;
*b = c;
}
//快速排序(从小到大)
void quickSort(char *arr, int l, int r) {
//l(left)左边界,r(right)右边界,i:左指针,j:右指针
if(l < r) {
int i = l;
int j = r;
char key = arr[l]; //基准值
while(i < j) {
while(i < j && arr[j] >= key) {
j--; //j定位到小于基准值的值
}
while(i < j && arr[i] <= key) {
i++; //i定位到大于于基准值的值
}
if (i < j) {
swap(arr + i, arr + j); //交换
}
}
arr[l] = arr[i];
arr[i] = key; //当i,j相等,将基准值和中间值交换(类似于二分法)
quickSort(arr, l, j - 1);
quickSort(arr, j + 1, r); //将中值分开的左右两堆进行排序
}
}
//判断字符值是否在ascii码区间内
bool judge(char c, int l, int r) {
if(c >= l && c <= r) return true;
else return false;
}
//将不同字符分类
void classify(char *arr, int l, int r, int keyl, int keyr) {
//l(left)左边界,r(right)右边界,i:左指针,j:右指针,keyl-keyr:ascii码区间内放在左部分
int i = l;
int j = r;
while(i < j) {
while(i < j && !judge(arr[j], keyl, keyr)) {
j--; //j定位到ascii码区间内的字符
}
while(i < j && judge(arr[i], keyl, keyr)) {
i++; //i定位到ascii码区间外的字符
}
if (i < j) {
swap(arr + i, arr + j); //交换
}
}
}
//将字符数组按“数字字符”“字母字符”“其他字符”排序
void function(char *arr) {
int length; //计算字符串总长度
for(length = 0; arr[length] != '\0'; length++);
classify(arr, 0, length - 1, 48, 57); //将数字字符放在从arr+0开始的单元
int end; //计算数字字符数量
for(end = 0; judge(arr[end], 48, 57); end++);
quickSort(arr, 0, end - 1); //数字字符排序
classify(arr, end, length - 1, 97, 122); //将小写字母字符放在从arr+end开始的单元
int start = end;
for(; judge(arr[end], 97, 122); end++); //计算小写字母的起始位置
quickSort(arr, start, end - 1); //数小写字母字符排序
classify(arr, end, length - 1, 65, 90); //将大写字母字符放在从arr+end开始的单元
start = end;
for(; judge(arr[end], 65, 90); end++); //计算大写字母的起始位置
quickSort(arr, start, end - 1); //大写字母字符排序
quickSort(arr, end, length - 1); //其他字符按ascii码排序
}
int main() {
printf("示例字符串:qweRtUhgY%98^&-=/ LK~mkBCAlio142 %#@w$S7*iloveU\n");
char ex[100] = "qweRtUhgY%98^&-=/ LK~mkBCAlio142 %#@w$S7*iloveU";
function(ex);
printf("\n排序后的字符串:%s\n", ex);
printf("\n--------开始用户操作--------\n");
char arr[1000];
printf("请输入字符串:");
gets(arr);
function(arr);
printf("\n排序后的字符串:%s\n", arr);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
typedef enum{ false = 0, true = 1 } bool;
//两个字符交换
void swap(char *a, char *b) {
char c = *a;
*a = *b;
*b = c;
}
//快速排序(从小到大)
void quickSort(char *arr, int l, int r) {
//l(left)左边界,r(right)右边界,i:左指针,j:右指针
if(l < r) {
int i = l;
int j = r;
char key = arr[l]; //基准值
while(i < j) {
while(i < j && arr[j] >= key) {
j--; //j定位到小于基准值的值
}
while(i < j && arr[i] <= key) {
i++; //i定位到大于于基准值的值
}
if (i < j) {
swap(arr + i, arr + j); //交换
}
}
arr[l] = arr[i];
arr[i] = key; //当i,j相等,将基准值和中间值交换(类似于二分法)
quickSort(arr, l, j - 1);
quickSort(arr, j + 1, r); //将中值分开的左右两堆进行排序
}
}
//判断字符值是否在ascii码区间内
bool judge(char c, int l, int r) {
if(c >= l && c <= r) return true;
else return false;
}
//将不同字符分类
void classify(char *arr, int l, int r, int keyl, int keyr) {
//l(left)左边界,r(right)右边界,i:左指针,j:右指针,keyl-keyr:ascii码区间内放在左部分
int i = l;
int j = r;
while(i < j) {
while(i < j && !judge(arr[j], keyl, keyr)) {
j--; //j定位到ascii码区间内的字符
}
while(i < j && judge(arr[i], keyl, keyr)) {
i++; //i定位到ascii码区间外的字符
}
if (i < j) {
swap(arr + i, arr + j); //交换
}
}
}
//将字符数组按“数字字符”“字母字符”“其他字符”排序
void function(char *arr) {
int length; //计算字符串总长度
for(length = 0; arr[length] != '\0'; length++);
classify(arr, 0, length - 1, 48, 57); //将数字字符放在从arr+0开始的单元
int end; //计算数字字符数量
for(end = 0; judge(arr[end], 48, 57); end++);
quickSort(arr, 0, end - 1); //数字字符排序
classify(arr, end, length - 1, 97, 122); //将小写字母字符放在从arr+end开始的单元
int start = end;
for(; judge(arr[end], 97, 122); end++); //计算小写字母的起始位置
quickSort(arr, start, end - 1); //数小写字母字符排序
classify(arr, end, length - 1, 65, 90); //将大写字母字符放在从arr+end开始的单元
start = end;
for(; judge(arr[end], 65, 90); end++); //计算大写字母的起始位置
quickSort(arr, start, end - 1); //大写字母字符排序
quickSort(arr, end, length - 1); //其他字符按ascii码排序
}
int main() {
printf("示例字符串:qweRtUhgY%98^&-=/ LK~mkBCAlio142 %#@w$S7*iloveU\n");
char ex[100] = "qweRtUhgY%98^&-=/ LK~mkBCAlio142 %#@w$S7*iloveU";
function(ex);
printf("\n排序后的字符串:%s\n", ex);
printf("\n--------开始用户操作--------\n");
char arr[1000];
printf("请输入字符串:");
gets(arr);
function(arr);
printf("\n排序后的字符串:%s\n", arr);
return 0;
}