字典排序问题

来源:互联网 发布:姚明场均数据 编辑:程序博客网 时间:2024/06/05 02:46

问题描述

当我们需要对连续存储的长度不一的文本行进行排序时,排序的标准是字母顺序,我们引入指针数组来处理这类问题,这一方法能够消除因移动文本行本身带来的复杂的存储管理和巨大的开销。
我们假设待排序的的文本行首尾相连地存储在一个长字符数组中,那么每个文本行都可以通过他的第一个字符的指针来访问。这些指针本身可以存储在一个数组中。这样,将指向两个文本行的指针传递给strcmp函数就可以实现对两个文本行的比较。 当交换次序颠倒的两个文本行时,只需交换两个文本行相对应的指针即可。代码如下:

#include "stdafx.h"#include "stdio.h"#include "string.h"char *courses[]= { "C", "C++", "PHP", "ASP", "ASP.NET", "C#", "JAVA", "BASIC", "PASCAL", "COBOL" };             //指针数组void sort(char *courses[], int n);int _tmain(int argc, char** argv){int len = 0;len = sizeof(courses)/sizeof(courses[1]);printf("Length: %d\n", len);for (int i = 0; i < len;i++)    printf("%s  ", courses[i]);printf("\n");sort(courses, len);for (int i = 0; i < len; i++)    printf("%s  ", courses[i]);printf("\n");return 0;}void sort(char *p[], int n){int i, j, k;char *temp;for (i = 0; i < n-1; i++){    k = i;    for (j = i; j < n; j++)    {        if (strcmp(p[k], p[j])>0)            k = j;    }    temp = p[k];    p[k] = p[i];    p[i] = temp;}}

在上述代码实现过程中碰到两个不错的问题:

  1. 如何获得字符串指针数组courses中字符串的数量?
    为了解决这个问题,我们首先理解courses是一个指针数组,courses中的数组元素是各文本行的首地址即指向各文本行的指针,所以我们可以用sizeof(courses)获得指针数组的地址长度,然后sizeof(courses[1])获得单个指针的地址长度,那么 sizeof(courses)/sizeof(courses[1]) 可以获得指针数组中元素的个数。

  2. 如何比较各个字符串的大小?
    在程序中我们用到了标准库 string.h 中的 strcmp 函数来对两个字符串进行比较,我们采用的排序算法是简单的冒泡算法。下面的代码对strcmp函数的实现提供了两种不同的思路。

    / /strcmp函数 :根据s按照字典顺序小于、等于或大于t的结果分别返回负整数、0或正整数 int strcmp(char *s, char *t){    int i;    for(i=0;*s[i]==t[i];i++)        if(*s='\0')        return 0;    return s[i]-t[i];}

    下面是用指针方式实现的strcmp 函数:

    / /strcmp函数 :根据s按照字典顺序小于、等于或大于t的结果分别返回负整数、0或正整数 int strcmp(char *s, char *t){    for(;*s==*t;s++,t++)        if(*s='\0')        return 0;    return *s-*t;}
0 0
原创粉丝点击