qsort without move
使用 qsort 排序字串陣列,輸出按字典排序方式輸出,但排列完成後,原始陣列內容不可改變
在不改變原始陣列的條件下,只要把字串指標複製出來,然後拿來排序就可以了
stringindex 改成只存放 string 的索引值,故在 cmpstringp 函式中要直接把 string 陣列拿來做比較
執行結果如下圖:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define length (sizeof(string) / sizeof(string[0]))
char string[][12] = { "Linux", "programming", "Embedded", "Android", "ittraining" };
static int cmpstringp(const void *p1, const void *p2)
{
return strcmp(*(char * const *)p1, *(char * const *)p2);
}
int main()
{
char* stringindex[length];
int i;
// copy pointer
for (i=0; i<length; i++)
{
stringindex[i] = string[i];
}
qsort(stringindex, length, sizeof(stringindex[0]), cmpstringp);
printf("\nSorted data:\n");
for (i=0; i<length; i++)
{
printf("%d = %s\n", i, stringindex[i]);
}
printf("After qsort, origonal array:\n");
for (i=0; i<length; i++)
{
printf("string[%d] = %s\n", i, string[i]);
}
exit(EXIT_SUCCESS);
}
在不改變原始陣列的條件下,只要把字串指標複製出來,然後拿來排序就可以了
改用 index 的方式
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #define length (sizeof(string) / sizeof(string[0])) char string[][20] = { "Linux", "programming", "Embedded", "Android", "ittraining" }; // p1 & p2 is index of string static int cmpstringp(const void *p1, const void *p2) { // return strcmp(*(char * const *)p1, *(char * const *)p2); return strcmp(string[*(int*)p1], string[*(int*)p2]); } int main() { //char* stringindex[length]; int stringindex[length]; int i; // create index for (i=0; i<length; i++) { stringindex[i] = i; } qsort(stringindex, length, sizeof(stringindex[0]), cmpstringp); printf("Sorted data:\n"); for (i=0; i<length; i++) { printf("%d = %s\n", i, string[stringindex[i]]); } printf("\nAfter qsort, origonal array:\n"); for (i=0; i<length; i++) { printf("string[%d] = %s\n", i, string[i]); } exit(EXIT_SUCCESS); }
stringindex 改成只存放 string 的索引值,故在 cmpstringp 函式中要直接把 string 陣列拿來做比較
執行結果如下圖:
留言