#include<stdio.h>
#include<iostream.h>
#include<conio.h>
void quicks(int *arr,int x,int pivot,int lo,int hi);
void swap1(int *x,int *y);
int main()
{
int *arr = new int[7];
arr[0] = 23;
arr[1] = 3;
arr[2] = -23;
arr[3] = 45;
arr[4] = 12;
arr[5] = 76;
arr[6] = -65;
quicks(arr,7,0,1,6);
for(int i = 0;i<7;i++)
std::cout << arr[i] <<"\t";
getch();
return 0;
}
void quicks(int *arr,int x,int pivot,int lo,int hi)
{
int i = lo,j = hi;
if(pivot < x-1)
{
while(i <= hi)
{
if(arr[i] <= arr[pivot])
i++;
else
break;
}
while(j >= lo)
{
if(arr[j] >= arr[pivot])
j--;
else
break;
}
if( i > j)
{
swap1(&arr[j],&arr[pivot]);
lo = pivot+1;
hi = x - 1;
quicks(arr,x,pivot,lo,hi);
}
else if(i == j)
{
pivot = pivot + 1;
lo = pivot+1;
hi = x - 1;
quicks(arr,x,pivot,lo,hi);
}
else if(i < j)
{
swap1(&arr[j],&arr[i]);
lo = i + 1;
hi = j - 1;
quicks(arr,x,pivot,lo,hi);
}
}
else
{
printf("\nDONE\n");
}
}
void swap1(int *x,int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
您好, 我编写了一个程序来实现Quick sort.But程序进入一个无限循环。在Quicks函数中,用于递增和递减i和j的while循环是问题。任何人都可以告诉我这个实现的错误是什么快速排序。
答案 0 :(得分:0)
使用您的输入和算法快速运行,您会注意到一段时间后会遇到无限循环。
您正在从quicks(arr,7,0,1,6);
开始循环。尝试将低值设置为“最右边”元素,即0。这并不一定能解决您的问题,因为算法看起来确实存在缺陷,高位的位置根本没有变化,而且我一直向高位移动。你试图让一个非常简单的任务复杂化。
i
会从lo
转到pivot
。 j
从hi
到pivot
。pivot
。找到pivot
位置正确后,您将向前移动lo
和{{1}},然后重复此过程。
看一下这张图片,你就可以了解所需的算法: