2d char数组的选择排序算法

时间:2016-02-08 01:11:44

标签: c arrays sorting selection

我正在尝试为C中的二维数组做一个选择排序算法(如标题所示),代码编译但不幸的是它没有对任何内容进行排序。

有什么我可以改变它会使它工作吗?还是我必须一起重新开始?

void sortStrings(char strings[5][32])
{
    int i, j, min;
    for (i = 0; i < sizeof(strings); i++){
        min = i;
        for (j = 0; j < sizeof(strings-1); j++){
            if (strings[i] < strings[min]){
                min = 1;
            }
        }
        if (min != i){
            swapStrings(strings[i], strings[min]);
        }
    }
}

此处还有我的swapStrings函数供参考:

void swapStrings(char string1[], char string2[])
{
    char *temp = string1;
    string1 = string2;
    string2 = temp;
}

6 个答案:

答案 0 :(得分:0)

sizeof返回参数在内存中获取的大小。 在您的情况下,char的大小不是数组的大小。 您可以使用strlen函数获取字符串的大小。 但是,您无法获得数组strings的大小,您需要在函数中添加参数。

答案 1 :(得分:0)

我在你的代码中看到了一些错误:

for (i = 0; i < sizeof(strings); i++){

你为什么使用sizeof? sizeof不是为了那个。

你想在这做什么:

if (strings[i] < strings[min]){

这似乎是一个错误。

你在这里要做什么?:

swapStrings(strings[i], strings[min])

您的函数swapStrings是错误的,因为不返回任何内容并且不会更改任何内容。

最后,你能解释一下你想做什么吗?

答案 2 :(得分:0)

看起来不对,因为在干运行期间我发现它在第一次运行时向result函数发送了swap

看起来您设置了i=Min=j=0,然后只检查了!=;

加上其他人的写作。

答案 3 :(得分:0)

void swapStrings(char string1[], char string2[])
{
    char *temp = string1;  //it means nothing in string
    string1 = string2;     //you must use strcpy(string1,string2)
    string2 = temp;
}

答案 4 :(得分:0)

如果没有传递排序逻辑的有效性,您在C语言中的字符串处理中缺少一些基础知识。您的交换函数是:

void swapStrings(char string1[], char string2[])
{
    char *temp = string1;
    string1 = string2;
    string2 = temp;
}

这种逻辑不适用于口碑。它是字符交换逻辑。为什么呢?

  • 您无法在C
  • 中指定字符串

您必须使用数组索引指针复制字符串,并使用其中一个字符串库复制函数(例如strcpy,{{1 }},strncpysprintfsnprintf等。 (注意:memcpy系列位于printf

接下来,要在stdio.h中使用temp,您必须知道swapStringsstring1的最大长度。为什么?您必须为string2提供足够的存储空间才能保留tempstring1中最长的存储空间。怎么样?计算string2内的最大长度或将最大长度作为参数传递给swapStrings

接下来,正确的是,当您将数组作为swapStrings传递给swapStrings时,您将屏蔽字符数组到指针的转换,每次数组都会发生作为参数传递给函数。因此,您为char string1[]传递的参数只需string1。 (转换仅限于第一级间接,例如,如果你有一个二维数组,说char *string1它将被转换为一个指向数组char strarray[20][64]的指针 - 输入char *strarray[64]

传递char (*)[64]string1的最大长度,您可以使用以下内容来交换字符串:

string2

这要求#include <stdlib.h> #include <string.h> ... void swapStrings (char *string1, char *string2, size_t maxlen12) { char *temp = malloc (maxlen12 + 1); /* you must allocate space for temp */ /* including space for nul-byte */ if (!temp) { /* validate ALL memory allocations */ fpritnf (stderr, "error: virtual memory exhausted.\n"); return; } /* you CANNOT ASSIGN strings, you must copy them */ strncpy (temp, string1, maxlen12 + 1); strncpy (string1, string2, maxlen12 + 1); strncpy (string2, temp, maxlen12 + 1); free (temp); /* if you allocate it, you are responsible for freeing it */ } string1都是有效的 nul-terminated 字符串。

注意:您也可以使用VLA(可变长度数组)而不是使用string2进行分配,但这只与C99 +或C89编译器有关添加了明确的VLA扩展名。

另请注意:如果您将指针的地址作为参数传递,则可以指定和交换指针,但这是另一天。

最后注意:如果mallocstring1差异很大(10,000或100,000的字符),您会想要使用不同的字符复制函数string2会将strncpy写入每个字符串中以 nul-byte 开头的所有字符。在长度不同的非常长的字符串中,这可能会有些低效。

答案 5 :(得分:0)

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>

void printArray(char *array[], int size) 
{
    int i;
    for (i=0; i<size; i++)
    {
        printf("%s ", array[i]);        
    }
    printf("\n");
}

/* Selection Sort in Descending Order */
void sortSelectionFromSmallest(char *array[], int size) 
{
    int unsortedStart; /* the start index of unsorted part */
    int i,j;
    int largestIndex;
    char *temp;

    for (unsortedStart = 0; unsortedStart < size - 1; unsortedStart++) 
    {
        /* search for the largest number in unsorted part */
        largestIndex = unsortedStart;
        for (i=unsortedStart + 1; i <= size-1; i++) 
        {
            //if (strcmp(array[largestIndex], array[i]) < 0)
            if (strlen(array[largestIndex]) < strlen(array[i]))
            {
                largestIndex = i;
            }
        }

        /* swap with start of unsorted */       
        temp = array[unsortedStart];
        array[unsortedStart] = array[largestIndex];
        array[largestIndex] = temp;

        /* print the array at intermediate steps */
        printArray(array, size);
    }
}

int main() 
{
    char* array[8] = {"London", "Edo", "Paris", "Taipei", "Beijing", "Singapore", "Berlin", "Shanghai"};
    printf("Original array\n");
    printArray(array, 8);

    printf("\nSorting array\n");    
    sortSelectionFromSmallest(array, 8);

    printf("\nSorted array\n");
    printArray(array, 8);

    return 0;
}