我正在尝试编写quicksort并理解算法。我理解快速排序的3个基本原则
我想我对这个算法遗漏了一些东西。任何指导都非常赞赏。
我的第一个问题是l和r,那些是数组的最小值和最大值?或者它是阵列左侧和右侧内的任何位置。
#include <iostream>
using namespace std;
void quicksort(int a[], int l , int r);
int partition(int a[], int l, int r);
void exchange(int a[], int i, int j);
int main()
{
const int MAX_ARRAY = 9;
// Quicksort
// Array of integers
int numArray[MAX_ARRAY] = {25,10,25,34,38,7,6,43,56};
for ( int i = 0 ; i < MAX_ARRAY ; i++)
{
cout << numArray[i] << endl;
}
quicksort(numArray, 4, 7);
// Call quicksort
for ( int i = 0 ; i < MAX_ARRAY ; i++)
{
cout << numArray[i]<< endl;
}
system("pause");
return 0;
}
void quicksort(int a[], int l , int r)
{
//
if (r <= l) {return;} // The max position and least position are now overlapping
int i = partition(a, l, r); // send the array and the two positions to partition
// i gives me the next position
quicksort(a,l,i-1); // sort left side
quicksort(a,i+1,r); // sort right side
}
int partition(int a[], int l, int r)
{
//Declarations
int i = l-1, j = r; int v = a[r];
for(;;) // Infinite ForLoop
{
// go through till you find a value in the array that is less than v = our pivot
while(a[++i] < v) ;
while (v < a[--j]) if (j == 1) break; // THis condition is to go thorugh and check for a number that is larger than v then if j is not at 1 then we break
if ( i >= j) break; // Overlap array
exchange(a, i , j); // swap the values
}
exchange(a,i,j); // swap the values
return i;
}
void exchange(int a[], int i, int j )
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
答案 0 :(得分:1)
我的第一个问题是l和r,那些是数组的最小值和最大值?或者它是阵列左侧和右侧的任何位置。
不,这些是当前子阵列的左右边界正在排序。我不知道为什么你用参数4
和7
调用方法:这意味着在第4个或第7个之前的元素都不会被排序。
答案 1 :(得分:-1)
首先,quicksort(numArray, 4, 7);
应为quicksort(numArray, 0, 8);
第二,为了使它快一点,你可以设置一个截止数字,如10,你切换到插入排序。对于小输入,插入排序比快速排序更快。