具有重复关键字的快速排序算法
Quicksort algorithm with duplicate keys
我正在尝试实现快速排序算法。以下代码适用于唯一元素,但不适用于具有重复元素的数组。请告诉我哪里做错了。另外,当我将pivot的值更改为0以外的其他数字时,程序会崩溃。这是代码:
#include <iostream>
#include <cstdlib>
using namespace std;
void swapme(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
void quicksort(int *arr, int size)
{
// these two variables will take care of position of comparison
int lower = 0, upper = size - 1;
int pivot = 0; // assigns pivot
if (size <= 1)
return;
while (lower < upper)
{
while (arr[lower] < arr[pivot])
{
++lower;
}
}
while (arr[upper] > arr[pivot])
{
--upper;
}
if (upper > lower)
{
swapme(arr[upper], arr[lower]);
// upper--;
// lower++;
}
quicksort(arr, lower);
quicksort(&arr[lower + 1], size - 1 - lower);
}
int main()
{
int arr[30];
for(int j = 0; j < 30; j++)
{
arr[j] = 1 + rand() % 5000;
}
for(int j = 0; j < 30; j++)
{
cout << arr[j] << "t";
}
cout << endl;
quicksort(arr, 30);
for(int j = 0; j < 30; j++)
{
cout << arr[j] << "t";
}
cout << endl;
cin.get();
cin.get();
}
更新:我终于设法让它工作起来了。这是固定版本:
void swapme(int &a, int &b )
{
int temp = a;
a = b;
b = temp;
}
void quicksort(int *arr, int size)
{
if (size <= 1)
return;
// These two variables will take care of position of comparison.
int lower = 0;
int upper = size-1;
int pivot = arr[upper/2]; // assigns pivot
while (lower <= upper)
{
while (arr[lower] < pivot)
++lower;
while (arr[upper] > pivot)
--upper;
if (upper >= lower)
{
swapme(arr[upper],arr[lower]);
if(arr[upper] == arr[lower])
{
// Can either increment or decrement in case of duplicate entry
upper--; // lower++;
}
}
}
quicksort(arr, lower);
quicksort( &arr[lower+1], size-1-lower);
}
您将pivot元素的索引存储在pivot
变量中,因此在循环过程中交换元素可能会更改pivot元件的选择。不是个好主意。我建议将pivot元素的实际值存储在pivot
中。
此外,如果这真的不是家庭作业,你为什么不简单地使用标准的图书馆设施呢?
#include <algorithm>
// ...
std::sort(arr + 0, arr + 30);
您将获得经过大量优化和测试的代码,这些代码将在任何时候都优于手写的Quicksort。
快速排序,可以实现任意数量的i/p整数。它还处理重复的密钥
#include <conio.h>
#include <string>
using namespace std;
void InputArray(int*,int);
void QuickSort(int *,int,int);
int partition(int *,int,int);
void swap(int *,int,int);
void printArr(int *,int Siz=11);
void main(){
int siz;
cout<<"Enter Array length : "; cin>>siz;
int *a=new int[siz];
InputArray(a,siz);
QuickSort(a,0,siz-1);
int i=0,j=11;
printArr(a,siz);
system("pause");
}
void InputArray(int*a,int s){
for(int i=0; i<s; i++){
cout<<"ELement ["<<i<<"] = "; cin>>a[i];
}
}
void QuickSort(int *a,int start,int end){
if(start<end){
int pivot=partition(a,start,end);
QuickSort(a,start,pivot);
QuickSort(a,pivot+1,end);
}
}
int partition(int *a,int start,int end){
int currentPivotValue=a[start];
int i=start-1, j=end+1;
while(true){
i++;
while(i<j && a[i]<currentPivotValue){ i++; }
j--;
while(j>start && a[j]>currentPivotValue) {j--;}
if(i<j) swap(a,i,j);
else return j;
}
}
void swap(int *b,int i,int j){
int t=b[i];
b[i]=b[j];
b[j]=t;
}
void printArr(int *a,int Siz){
for(int i=0; i<Siz; i++) cout<<a[i]<<" ";
}
相关文章:
- C++运行时错误与快速排序算法抛出堆栈转储错误
- 快速排序函数在快速排序算法中如何工作?
- 这种快速排序算法有什么问题?
- 为什么我的递归快速排序算法有如此不平衡的分区
- 使用霍尔分区方案的快速排序算法返回原始未排序列表
- 如何在快速排序算法中使已排序数组的交换次数为零
- 快速排序算法,一些特定输入序列的错误答案和分段错误
- 为对象向量实现快速排序算法
- 快速排序算法改进,如果更多重复键
- 快速排序算法遇到问题
- 快速排序算法代码
- 快速排序算法不起作用
- c++快速排序算法中500000排序整数数组的Seg错误
- 整数的快速排序算法
- C++快速排序算法崩溃
- 快速排序算法不起作用
- 快速排序算法(递归)
- C++快速排序算法不断崩溃
- 具有重复关键字的快速排序算法
- 当对可被7整除的向量大小进行排序时,是否有什么东西会导致快速排序算法出错