算法题:字符串排序

来源:互联网 发布:java语言程序设计基础 编辑:程序博客网 时间:2024/06/06 21:49
/*一个字符数组,里面的字符可能是a - z、A - Z、0 - 9.现在要求对数组进行排序,要求所有小写字符放在最前面,所有大写字符放在中间,所有数字放在最后,而且各部分内部分别有序。*/#include <iostream>#include <string.h>using namespace std;void Swap(char &a, char &b){    char temp = a;    a = b;    b = temp;}void Grial(char *&str, int low, int high){    if (low >= high)        return;    int i = low - 1;    int j = low;    while (j < high)    {        while (str[high]>str[j])j++;        i++;        if (i != j)            Swap(str[i], str[j]);        j++;    }    i++;    if (i != high)        Swap(str[i], str[high]);    Grial(str, low, i - 1);    Grial(str, i + 1, high);}void Swap(char *p1, char *p2){    while (p1 < p2)    {        Swap(*p1, *p2);        p1++;        p2--;    }}void Grial(char *&str){    //因为a-z对应的ASCLL表中的值是大于A-Z,A-Z又大于    //0-9,所以先让整体排列成z-aZ-A9-0的形式,然后局部翻转,    //达到最终的结果。    //选择快排使它有序。    int n = strlen(str) - 1;    Grial(str, 0, n);    //此时已经整体有序,在进行局部调整。    char *p = str;    while (*p>=97)    {        p++;    }    char *q = p;    Swap(str,p-1);    while (*q < 97 && *q >= 65)    {        q++;    }    Swap(p,q-1);    p = q;    while (*(q+1) != '\0')    {        q++;    }    Swap(p,q);}int main(){    char *s = new char[100];    strcpy(s, "1321312796543aDAAABBBBDDDDacdddccaa");    cout << s << endl;    Grial(s);    cout << s << endl;    return 0;}

这里写图片描述

0 0