排åºé‡å¤æ•°å­—

时间:2013-07-25 19:42:09

标签: c sorting

 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};

排åºæ­¤ç±»ç³»åˆ—的最佳方法是什么?请记ä½ï¼Œæˆ‘希望最低é™åº¦çš„å¤æ‚性。

5 个答案:

答案 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的下一个索引