簡體   English   中英

Quicksort不適用於最后兩個數字

[英]Quicksort doesn't work for the last two numbers

任務是為數組中的未知類型的元素編寫快速排序(僅使用C代碼),但我的代碼不適用於最后兩個元素。 以下數字輸出是'67 45 44 33 5 1 -3 0 -4 -100'我也嘗試調試但我唯一理解的是最后的數字只是不比較。

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <memory.h>
typedef int typeEl;

void swap(void* a, void* b, size_t sizeOfElem) {
    void* tmp = calloc(1,sizeOfElem);
    memcpy(tmp, a, sizeOfElem);
    memcpy(a, b, sizeOfElem);
    memcpy(b, tmp, sizeOfElem);
}

int compare(const void* a, const void* b)
{

    return (*(typeEl*)a - *(typeEl*)b);
}

void quickSortR(void* a, long N, size_t sizeOfElem, int (*comp)(const void* c, const void* d)) 
{

  long i = 0, j = N;        


  void* p = (void *) ((char *)a + (N>>1)*sizeOfElem);       

  do {
    while ( comp((void *) ((char *)a + i*sizeOfElem), p)>0) i++;
    while ( comp((void *) ((char *)a + j*sizeOfElem), p)<0) j--;

    if (i <= j) {
      swap((void *) ((char *)a + i*sizeOfElem), (void *) ((char *)a + j*sizeOfElem), sizeOfElem);
      i++; j--;
    }
  } while ( i<=j );


  if ( j > 0 ) quickSortR((void *)a, j, sizeOfElem, comp);
  if ( N > i ) quickSortR((void *) ((char *)a + i*sizeOfElem), N-i,sizeOfElem, comp);
}
int main() {
    int n;
   int m[10] = {1,-3,5,-100,45,33,44,67,-4, 0};

   quickSortR((void *)m, 10, sizeof(int),compare);              
    for (n=0; n<10; n++)
        printf ("%d ",m[n]);
   return 0;
}

有人可以提供建議嗎? 謝謝你的幫助!

您的代碼中存在3個問題:

  1. j = N的初始化應為j = N - 1 原因:稍后使用位置j處的元素開始比較, C數組的索引為[0,N-1]

  2. 樞軸p不應是指針而是值。 這會影響交換位置p處的值時的結果,但您仍將其視為樞軸。 你的代碼似乎是為了與指針進行比較而設計的,但是我可以提出一個快速而丑陋(也很危險!)的修復:
    替換你的代碼:

     void* p = (void *) ((char *)a + (N>>1)*sizeOfElem); 

    用這些:

     void* p = (void *) ((char *)a + (N>>1)*sizeOfElem); void *px = malloc(sizeOfElem); memcpy(px, p, sizeOfElem); p = px; 
  3. 這行代碼:

     if ( j > 0) quickSortR((void *)a, j, sizeOfElem, comp); 

    應該:

     if ( j > 0) quickSortR((void *)a, j + 1, sizeOfElem, comp); 

    因為在quickSortR的第二個參數,你傳遞的是數組的長度。

解決所有這三個問題,您的代碼將給出正確的結果。

編輯:
當我說上面的3 problems ,我指的是實現算法時的問題。 除此之外,你的函數中有內存泄漏compare (只需free(tmp)來解決它)。 if ( N > i )也可以是if ( N > i + 1 )
:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM