算法 - 快速排序的实现问题

时间:2018-04-10 14:31:32

标签: c algorithm logic quicksort

我正在学习算法作为初学者。在学习快速排序时,我发现有几种方法可以实现快速排序。所以我选择这种方式来tutorial实现快速排序。

它选择数组末尾的元素作为pivot,并选择第一个元素作为分隔值小于和大于pivot的值的墙。当排序完成时,将轴插入墙的位置,制作分区。

这是我在c:

中的实现
void simpleqs(int* data,int start,int end)
{
 int wall = start;
 int pivot = data[end];

 //Base case
 if (start >= end)
 {
   return;
 }

 //Sort the array
 for(int e = start;e < end-1; e++)
 {
   if(data[e] < pivot)
   {
    swap(&data[e],&data[wall]);
    wall++;
   }
 }

 //Partition

 if(data[wall] >= pivot)
 {
   swap(&data[wall],&data[end]);
 }

 simpleqs(data,start,wall-1);
 simpleqs(data,wall+1,end);
 }

主要:

int main(void)
{
  int dataSet[] = {2,4,1,5,6,9,8,3,7,10,20,13,11,17,15};

  int size = sizeof(dataSet)/sizeof(int);

  simpleqs(dataSet,0,size-1);

  for(int e = 0;e < size ; e++)
  {
    printf("%d,", dataSet[e]);
  }
  printf("\n");

}

错误的位置总会有一个值,我无法弄清楚原因。

像这样:

1,2,3,4,5,6,8,9,7,10,11,13,15,17,20,

请帮我修改逻辑,谢谢!

2 个答案:

答案 0 :(得分:4)

你应该走到尽头,而不是结束--1。

// Sort the array
for (int e = start; e < end; e++)
{
    if (data[e] < pivot)
    {
        swap(&data[e], &data[wall]);
        wall++;
    }
}

答案 1 :(得分:1)

您已实施Lomuto partition,但错过了对div元素的处理:

.catBox:not(:last-child) {margin-right: 4px;}