在 C 中从命令行编写插入排序和交换函数
writing insertion sort and swap function from command line in C
我尝试用 C 编写自己的插入 sort
和 swap
函数。
插入 sort
或 swap
正在编译但尚未运行。
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
}
a
和 b
是 char *
,解引用指针 a
和 b
然后交换 -
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]) )
因为你是从远端开始,然后到开头。
我尝试用 C 编写自己的插入 sort
和 swap
函数。
插入 sort
或 swap
正在编译但尚未运行。
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
}
a
和 b
是 char *
,解引用指针 a
和 b
然后交换 -
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]) )
因为你是从远端开始,然后到开头。