Bubblesort忽略最后一个元素

时间:2018-06-07 08:37:27

标签: c sorting bubble-sort

我正在尝试对指针数组进行排序,具体取决于它们指向的字符串。我对bubblesort的实现似乎忽略了传递给它的最后一个元素。

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

void swap(char **a,char **b);
int main(void);

int main(void)
{
    char *ptr[1000]; //build an array of 1000 pointers
    short ptrpos = 0; //start at 0th pointer
    char input[500]; 
    printf("Enter strings(names), seperate by newline\nEOF(Ctrl-D) finishes the input process.\n");
    while(fgets(input,sizeof(input),stdin))
    {
        ptr[ptrpos] = malloc(strlen(input)+1); 
        strcpy(ptr[ptrpos],input); 
        ptrpos++; 
    }
    short length = ptrpos-1;

//BEGIN BUBBLE SORT
    for(short h = 1; h < length; h++)
    {
        for(short i = 0;i < length - h; i++)
        {
            if(strcmp(ptr[i],ptr[i+1]) > 0) 
                swap(&ptr[i],&ptr[i+1]); 
        }
    }
//END BUBBLE SORT
    printf("\n----- Sorted List -----\n");
    for(ptrpos = 0;ptrpos <= length;ptrpos++)
        printf("%s",ptr[ptrpos]);

    return 0;
}
void swap(char **a,char **b) //swaps adresses of passed pointers
{
    char *temp = *a;
    *a = *b;
    *b = temp;
}

输出如下:

Enter strings(names), seperate by newline
EOF(Ctrl-D) finishes the input process.
Echo
Charlie
Foxtrot
Alpha
Golf
Bravo
Delta

----- Sorted List -----
Alpha
Bravo
Charlie
Echo
Foxtrot
Golf
Delta 

为什么忽略最后一个字符串?我错过了一些明显的东西吗?

3 个答案:

答案 0 :(得分:2)

数字就是例子。

$('#copypass2').click(function(){ var list = document.getElementById('txtList').innerHTML; var copypass = document.getElementById('copypass1').innerHTML; list = list.split("\n"); list.forEach(function(element) { alert(element + copypass); }); }); 开始计算ptrpos,这意味着如果您有6个元素,0ptrpos循环的最后一次迭代后为6。用

计算长度时
while

你得到short length = ptrpos-1;

您的length = 5 - 循环以for结尾,这意味着它们只计为4,产生的5个元素不是6。

由于数组的实际长度为6,我建议您将提到的行更改为

counter < length

现在short length = ptrpos; 将等于数组中元素的数量。

答案 1 :(得分:1)

这就是造成这个问题的原因:

short length = ptrpos-1;

//BEGIN BUBBLE SORT
for(short h = 1; h < length; h++)

将循环更改为

for(short h = 1; h <= length; h++)

或改变 for(ptrpos = 0;ptrpos <= length;ptrpos++)
for(ptrpos = 0;ptrpos < length;ptrpos++) 和,short length = ptrpos;

截至目前,用于排序的循环执行的时间比所需的少一个。但是,打印的循环按for(ptrpos = 0;ptrpos <= length;ptrpos++)执行了预期的次数。

我做了一些改进:

  • 检查malloc是否返回NULL,然后再进行进一步访问。

答案 2 :(得分:0)

这是一个工作版本, 我评论了我的修改

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

void swap(char **a,char **b);
int main(void);

int main(void)
{
    char *ptr[1000]; //build an array of 1000 pointers
    short ptrpos = 0; //start at 0th pointer
    char input[500]; 
    printf("Enter strings(names), seperate by newline\nEOF(Ctrl-D) finishes the input process.\n");
    while(fgets(input,sizeof(input),stdin))
    {
        ptr[ptrpos] = malloc(strlen(input)+1); 
        strcpy(ptr[ptrpos],input); 
        ptrpos++; 
    }
    short length = ptrpos; //removed -1

//BEGIN BUBBLE SORT
    for(short h = 1; h < length; h++)
    {
        for(short i = 0;i < length - h; i++)
        {
            if(strcmp(ptr[i],ptr[i+1]) > 0)
                swap(&ptr[i],&ptr[i+1]); 
        }
    }
//END BUBBLE SORT
    printf("\n----- Sorted List -----\n");
    for(ptrpos = 0;ptrpos < length;ptrpos++) // transofrmed <= in <
        printf("%s",ptr[ptrpos]);

    return 0;
}
void swap(char **a,char **b) //swaps adresses of passed pointers
{
    char *temp = *a;
    *a = *b;
    *b = temp;
}