在 C 中从命令行编写插入排序和交换函数

writing insertion sort and swap function from command line in C

我尝试用 C 编写自己的插入 sortswap 函数。 插入 sortswap 正在编译但尚未运行。

input: gcc insertion.c -o insertion ./insertion alfalfa

输入:紫花苜蓿

产出:苜蓿

#include <stdio.h>
#include <string.h>
#define SORTL 20

char * insertionsort(int *countargs, char *word);
void swap(char *a, char *b);

/* Enter word to insertion sort at the terminal */
int main(int argc, char *argv[]){

    /* Pass arguments from command line */
    if(argc != 2)
        perror("Please enter two arguments.");
    int argcount = strlen(argv[1]);
    char presort[SORTL];
    strcpy(presort, argv[1]);
    char * resultword;

    resultword = insertionsort( &argcount, presort );

    printf("Presort: %s\nPostsort: %s", presort, resultword);

    return 0;
}

char * insertionsort(int *countargs, char word[]){

    int i, j;

    for( i = 1; i < *countargs; i++) {
        j = i;
        while( (j < 0) && (word[j] < word[j-1]) ) {
            swap( &word[j], &word[j-1] );
            j = j - 1;
        }
    }
    return word;
    }

void swap(char *a, char * b)
{
   char temp;

   temp = b;
   b   = a;
   a   = temp;   
}

1.在这个函数中-

void swap(char *a, char * b)
{ 
   char temp;            
   temp = b;             //assigining char * to char 
   b   = a;
   a   = temp;           // same here 
}

abchar * ,解引用指针 ab 然后交换 -

void swap(char *a, char * b)
{
   char temp;
   temp = *b;
   *b   = *a;
   *a   = temp;   
}

2. 在你的函数中 -

for( i = 1; i < *countargs; i++) {
    j = i;
    while( (j < 0) && (word[j] < word[j-1])){   //this loop will not works as j is not < 0
        swap( &word[j], &word[j-1] );
        j = j - 1;
    }
}

您的 while 循环不会迭代,因为从 j 开始不小于 0,因此不检查第二个条件。在 while 循环中这个条件 j<0 应该是 j>0 .

您需要更改交换功能

void swap(char *a, char * b)
{
    char temp;

    temp = *b;
    *b   = *a;
    *a   = temp;   
}

因为在swap()中你需要交换内存中的字符,而不是变量指向的地址。


另一件事,根据最后的 printf() 语句,我觉得您想打印较旧的未排序字符串和较新的已排序字符串。如果是这样,那么它将不起作用。只会打印一个字符串,因为本质上你只是在交换初始字符串中的字符,而 resultword 指向相同的字符串,

resultword = insertionsort( &argcount, presort );
//sending presort and receiving it in word in the function insertionsort
//receiving the return in resultword

&

return word;
//and returning back the same address from insertionsort

编辑

您的 while 循环中的条件不正确。应该是j > 0

while( (j > 0) && (word[j] < word[j-1]) )

因为你是从远端开始,然后到开头。