int a[] = {0, 0, 0, 0, 0, 0, 1, 1, 2, 0, 0, 2, 1, 1, 0, 0, 0, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0};
排åºæ¤ç±»ç³»åˆ—的最佳方法是什么?请记ä½ï¼Œæˆ‘希望最低é™åº¦çš„å¤æ‚性。
ç”案 0 :(得分:4)
如果数å—的上é™å¾ˆå°ï¼Œæ‚¨å¯ä»¥ä½¿ç”¨è®¡æ•°æŽ’åºï¼šè®¡ç®—æ¯ä¸ªé¡¹ç›®åœ¨æ•°ç»„ä¸å‡ºçŽ°çš„次数,然åŽé历数组,并为æ¯ä¸ªå€¼è¾“入尽å¯èƒ½å¤šçš„项目
例如,在您的情况下,您将计算17个零,7个和4个两个。将å‰17项设置为0,将以下7项设置为1,将剩余的4项设置为2以获得排åºæ•°ç»„。
è¿™ç§æ–¹æ³•å…·æœ‰çº¿æ€§å¤æ‚性。
ç”案 1 :(得分:2)
您å¯ä»¥ä½¿ç”¨Counting Sort
对æ¤ç³»åˆ—进行排åºã€‚
ç”案 2 :(得分:2)
如果数å—系列真æ£é™åˆ¶åœ¨0-2çš„å€¼ï¼Œé‚£ä¹ˆæœ€å¥½çš„åŠžæ³•å°±æ˜¯ä½¿ç”¨è®¡ç®—çš„æ ·å¼æŽ’åºã€‚
void CountedSortMaxThree(int* array, size_t length) {
int count0 = 0;
int count1 = 0;
int count2 = 0;
for (int i = 0; i < length; i++) {
switch(array[i]) {
case 0: count0++; break;
case 1: count1++; break;
case 2: count2++; break;
}
}
int index = 0;
while (count0-- > 0) array[index++] = 0;
while (count1-- > 0) array[index++] = 1;
while (count2-- > 0) array[index++] = 2;
}
è¦é‡å¤ä½¿ç”¨ï¼Œæ‚¨éœ€è¦å®šä¹‰ä¸€ä¸ªç‰äºŽæœ€å¤§å€¼ä¸Žç¡¬ç¼–ç æ•°é‡çš„å˜å‚¨æ¡¶æ•°ç»„
void CountedSort(int* array, int length, int max) {
int* buckets = malloc(sizeof(int) * max);
for (int i = 0; i < length; i++) {
bucket[array[i]]++;
}
int index = 0;
for (int i = 0; i < max; i++) {
while (buckets[i]-- > 0) {
array[index++] = i;
}
}
free(buckets);
}
请注æ„,当值的范围很å°æ—¶ï¼Œæ‚¨åº”该åªä½¿ç”¨è®¡æ•°æŽ’åºã€‚在您的示例ä¸ï¼ŒèŒƒå›´æ˜¯3(0到2ï¼‰ï¼Œå› æ¤è®¡æ•°æŽ’åºå·²ç»æˆç†Ÿã€‚如果范围更高(想想Int32.Max
ï¼‰é‚£ä¹ˆä½ æœ€ç»ˆä¼šåˆ†é…一个巨大的桶阵列,最终效率会相当低
ç”案 3 :(得分:0)
您å¯ä»¥ä½¿ç”¨qsort
功能。
ç”案 4 :(得分:0)
void sort012Dutch(int A[],int n)
{
int pos0=0,pos2=n-1,i=0;
while(i<n)
{
if(A[i]==0)
{
A[i]=A[pos0];
A[pos0]=0;
pos0++;
}
if(A[i]==2&&i<pos2)
{
A[i]=A[pos2];
A[pos2]=2;
pos2--;
i--;//0 could be swapped
}
i++;
}
}
pos0表示数组ä¸è¦æ’å…¥0的下一个索引
pos2表示数组ä¸è¦æ’å…¥2的下一个索引