テストしました。typoがあったので修正しました。
コード:
#include <stdio.h>
#include <stdlib.h>
#define STAGE_MAX 6
#define numof(x) (sizeof(x)/sizeof((x)[0]))
typedef struct{
int Count;
int Ptn;
int StopCount;
float Speed;
}STAGE_DATA;
int CompDate(const void* pElem1, const void* pElem2){
// ポインタ取得用
const STAGE_DATA* pmem1 = (const STAGE_DATA*)pElem1;
const STAGE_DATA* pmem2 = (const STAGE_DATA*)pElem2;
if (pmem1->Count == 0) {
return pmem2->Count == 0 ? 0 : 1;
} else if (pmem2->Count == 0) {
/* pmem1->Count != 0 */
return -1;
} else if (pmem1->Count > pmem2->Count) {
return 1;
} else if (pmem1->Count < pmem2->Count) {
return -1;
} else {
return 0;
}
}
static STAGE_DATA Stage[STAGE_MAX] = {
{0, 0, 0, 0.0f},
{1, 1, 1, 1.0f},
{2, 2, 2, 2.0f},
{7, 3, 3, 3.0f},
{0, 4, 4, 4.0f},
{2, 5, 5, 5.0f}
};
void printStage(void) {
int i;
printf("Count = { %d", Stage[0].Count);
for (i = 1; i < STAGE_MAX; i++) printf(", %d", Stage[i].Count);
printf(" }\n");
printf("Ptn = { %d", Stage[0].Ptn);
for (i = 1; i < STAGE_MAX; i++) printf(", %d", Stage[i].Ptn);
printf(" }\n");
}
int main(void) {
puts("before qsort:");
printStage();
qsort( Stage, numof(Stage), sizeof *Stage, CompDate );
puts("after qsort:");
printStage();
return 0;
}
出力
コード:
before qsort:
Count = { 0, 1, 2, 7, 0, 2 }
Ptn = { 0, 1, 2, 3, 4, 5 }
after qsort:
Count = { 1, 2, 2, 7, 0, 0 }
Ptn = { 1, 2, 5, 3, 0, 4 }
box さんが書きました:いったん
0, 0, 1, 2, 2, 7
とソートします。
その後で、「先頭から探索し、0を見つけたら、
先頭の次以降を1個ずつ前へずらし、あいた場所(つまりいちばん最後)へ
0を移動させる」というロジックを手で組み込む必要があります。
こんな下手に実装するとO(N^2)かかりそうな、無駄に手間がかかることをする必要はありません。