算法题:字符串排序

/*
一个字符数组,里面的字符可能是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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-29 14:55:30

算法题:字符串排序的相关文章

腾讯算法岗一面算法题——计数排序

给定两个整数数组,对第一个数组进行排序,整数顺序由其在第二个数组中的位置决定.对于没有出现在第二个整数数组中的整数,应排在末尾,其之间的顺序无限制.这里整数的取值范围是[0, 2 ^ 32 - 1] 例: 第一个整数数组为 5 1 6 2 1 2 3, 第二个整数数组为2 1 3, 则排序结果为2 2 1 1 3 6 5或2 2 1 1 3 5 6 这道题很明显的第一个思路就是,先生成一个数到index下标的映射,然后建立一个compare函数,根据这个compare函数写一个快排. 相关代码如

(算法题)hasp 排序

问题如下: 假设我有一组HashMap类型的数据,他的 key 为String 类型,他的 Value为Integer类型(hashmap中不能存基本数据类型,只能存引用数据类型)如下: 如果我要对其中的value 进行排序,如何解决? 首先,我们知道,hashmap为无序的,如果要对hashmap 进行排序,我们必须借助其他类型的集合,通过百度我们了解到,hashmap有一个子类 LinkedHashMap 为有序结构,所以我们将hashmap排序后可以用其子类LinkedHashMap接受

算法题13 排序算法

1 快速排序 http://blog.csdn.net/morewindows/article/details/6684558 这篇博客介绍的非常清晰易懂了.主要就是挖坑,填坑+分治法策略.笔者这里就只贴出代码来 1 void QuickSortCore(int arr[],int start,int end) 2 { 3 int i=start,j=end; 4 //以起点为基准值,先挖一个坑,需要用一个比x小的值来填i坑 5 int x=arr[i]; 6 while (i<j) 7 { 8

[C]字符串排序之-冒泡法

在oj刷题,遇见一题字符串排序题. 脑海里瞬间闪过数组排序. 思路有了,打开题解看看别人的思路,发现好多人的排序方法显得比较臃肿,可能也是我的水平不够,欣赏不来吧. 不过用冒泡法排序的时候一定要记得字符串不可以通过值传递的方式来修改!!! 谨记strcpy大法好!!! 附上原题及代码; 题目:输入三个字符串,按由小到大的顺序输出 1 #include <stdio.h> 2 #include <string.h> 3 4 int main() 5 { 6 char ar[3][10

笔试算法题(53):四种基本排序方法的性能特征(Selection,Insertion,Bubble,Shell)

四种基本算法概述: 基本排序:选择,插入,冒泡,希尔.上述算法适用于小规模文件和特殊文件的排序,并不适合大规模随机排序的文件.前三种算法的执行时间与N2成正比,希尔算法的执行时间与N3/2(或更快)成正比: 前三种算法在平均,最坏情况下都是N2,而且都不需要额外的内存:所以尽管他们的运行时间只相差常数倍,但运行方式不同: 对于已经就序的序列而言,插入排序和冒泡排序的运行时间都是O(N),但是选择排序的时间仍旧是O(N^2): 因为Insertion和Bubble都是相邻项间的比较交换,所以不会出

笔试算法题(35):最长递增子序列 &amp; 判定一个字符串是否可由另一个字符串旋转得到

出题:求数组中最长递增子序列的长度(递增子序列的元素可以不相连): 分析: 解法1:应用DP之前需要确定当前问题是否具有无后效性,也就是每个状态都是对之前状态的一个总结,之后的状态仅会受到前一个状态的影响:对于递增子序列 而言,可以首先确定前面k个元素的最长子序列,然后计算增加一个元素之后的最长子序列.由于每个位置i都会与0-i的每个位置之前的LIS进行比较,并选 择保持递增的一个序列,所以总能找到LIS,但是时间复杂度为O(N^2),空间复杂度为O(N): 此解法的性能的瓶颈在于对于位置为i+

(关于一个算法题的两点新思路)给你一组字符串 如 {5,2,3,2,4,5,1,2,1,5},让你输出里面出现次数最多且数值最大的一个,出现几次

在网上看到一个算法题,不是很难,搜一下也有解决办法,但是一般都是几层for循环,试着写了下 /** * 给你一组字符串 如 {5,2,3,2,4,5,1,2,1,5},让你输出里面出现次数最多且数值最大的一个,出现几次 * 优点:时间复杂度为O(n) * 缺点:产生一些多余的空间,如 6,7,8没有的数也会分配一个数组空间,但是基本可以忽略 * 限制:需要预先知道最大的值是多少,或者说小于多少,这样才好确定预先分配一个数组长度是多少 */ public static void method1()

蓝桥杯 算法训练 最小乘积(基本型) (水题,排序)

算法训练 最小乘积(基本型) 时间限制:1.0s   内存限制:512.0MB 问题描述 给两组数,各n个. 请调整每组数的排列顺序,使得两组数据相同下标元素对应相乘,然后相加的和最小.要求程序输出这个最小值. 例如两组数分别为:1 3 -5和-2 4 1 那么对应乘积取和的最小值应为: (-5) * 4 + 3 * (-2) + 1 * 1 = -25 输入格式 第一个行一个数T表示数据组数.后面每组数据,先读入一个n,接下来两行每行n个数,每个数的绝对值小于等于1000. n<=8,T<=

一道有趣的算法题:仿照Excel的列编号,给定一个数字,输出该列编号字符串

       By Long Luo 最近遇到一个算法题: 仿照Excel的列编号,给出一个数字,输出该列编号字符串. 例如:A对应1,Z对应26,AA对应27,AZ对应52 ...... 这个题目是一个典型的26进制思路去处理,但是这个题目里面有很多陷阱,在1, 26, 52等特殊情况进行考虑,经过晚上接近1个小时的编写,完成的代码如下: C++代码如下: #include <iostream> #include <string.h> using namespace std; /

经典算法题每日演练——第二十四题 梳排序

原文:经典算法题每日演练--第二十四题 梳排序 这篇再看看一个经典的排序,梳排序,为什么取名为梳,可能每个梳都有自己的gap吧,大梳子gap大一点,小梳子gap小一点. 上一篇我们看到鸡尾酒排序是在冒泡排序上做了一些优化,将单向的比较变成了双向,同样这里的梳排序也是在冒泡排序上做了一些优化. 冒泡排序上我们的选择是相邻的两个数做比较,就是他们的gap为1,其实梳排序提出了不同的观点,如果将这里的gap设置为一定的大小, 效率反而必gap=1要高效的多. 下面我们看看具体思想,梳排序有这样一个1.