快速排序的实施

时间:2012-11-15 08:46:23

标签: sorting quicksort

#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循环是问题。任何人都可以告诉我这个实现的错误是什么快速排序。

1 个答案:

答案 0 :(得分:0)

使用您的输入和算法快速运行,您会注意到一段时间后会遇到无限循环。

您正在从quicks(arr,7,0,1,6);开始循环。尝试将低值设置为“最右边”元素,即0。这并不一定能解决您的问题,因为算法看起来确实存在缺陷,高位的位置根本没有变化,而且我一直向高位移动。你试图让一个非常简单的任务复杂化。

i会从lo转到pivotjhipivotpivot。找到pivot位置正确后,您将向前移动lo和{{1}},然后重复此过程。

看一下这张图片,你就可以了解所需的算法: enter image description here

相关问题