我正在学习算法作为初学者。在学习快速排序时,我发现有几种方法可以实现快速排序。所以我选择这种方式来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,
请帮我修改逻辑,谢谢!
答案 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;}