编程快速算法Q.

时间:2010-12-20 01:28:33

标签: c++ algorithm

我正在尝试编写quicksort并理解算法。我理解快速排序的3个基本原则

  • 元素a [i]在数组的最后位置为某些i。
  • [l],a [i1]中的所有元素均不大于a [i]。
  • [i + 1],...,a [r]中的所有元素都不小于[i]。

我想我对这个算法遗漏了一些东西。任何指导都非常赞赏。

我的第一个问题是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;
}

2 个答案:

答案 0 :(得分:1)

我的第一个问题是l和r,那些是数组的最小值和最大值?或者它是阵列左侧和右侧的任何位置。
不,这些是当前子阵列的左右边界正在排序。我不知道为什么你用参数47调用方法:这意味着在第4个或第7个之前的元素都不会被排序。

答案 1 :(得分:-1)

首先,quicksort(numArray, 4, 7);应为quicksort(numArray, 0, 8);

第二,为了使它快一点,你可以设置一个截止数字,如10,你切换到插入排序。对于小输入,插入排序比快速排序更快。