2012-05-22 56 views
2

我是相当新的编程和一直在学习排序算法一段时间now.I实施快速排序在C下面。它使用三个分区的中位数来选择枢纽。 代码的问题是我每次运行它时,应该是有序数组的中值/中值的元素是未排序的,即它发生在别的地方。 下面是代码:快速排序返回未排序的中间/中值元素?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <limits.h> 

void swap(int *x, int *y) 
{ 
    int temp = *x; 
    *x = *y; 
    *y = temp; 
    return ; 
} 

int median3(int a[], int left, int right)//Uses median of three partitioning technique 
{ 
    int center = (left + right)/2; 
    if (a[center] < a[left]) 
     swap(&a[left],&a[center]); 
    if (a[right] < a[left]) 
     swap(&a[left],&a[right]); 
    if (a[right]< a[center]) 
     swap(&a[center],&a[right]); 

    swap(&a[center], &a[right - 1]);//since the largest is already in the right. 
    return a[right - 1]; 
} 

void quicksort(int a[], int left, int right) 
{ 
    if (left < right) { 
    int pivot = median3(a,left,right); 
    int i = left; 
    int j = right - 1; 
    for (; ;) { 
     while(a[++i]<pivot) {} 
     while(pivot<a[--j]) {} 
     if (i < j) 
      swap(&a[i],&a[j]); 
     else 
      break ; 
    } 
    swap(&a[i],& a[right -1]); 
    quicksort(a,left,i-1); 
    quicksort(a,i+1,right); 
    } 
    return ; 
} 

int main(int argc, char* argv[]) 
{ 
    int i; 
    int a[] = {8,1,4,9,6,3,5,2,7,0}; 
    quicksort(a,0,9); 
    for (i = 0 ; i < 10 ; i++) 
     printf("%d\n",a[i]); 
    return 0; 
} 
+1

你尝试通过代码在调试器步进,看看什么是真正打算上 ? –

+1

你的实现是错误的,不仅“重新调整未排序的中间/中值元素”,更改你的测试数据,你会看到输出是混乱的。 我建议你重新学习算法并重新编写代码。 – StanleyZ

回答