使用vector比较方便,不需要再实现栈,所以直接使用pair<int, int>来保存快排中需要排序的区间,直接使用vector< pair<int, int> >比较方便。
直接上代码吧,也没技术含量。
#include <iostream>
#include <vector>
#include <ctime>
using namespace std;
/*int partition2(int arr[], int begin, int end) //这个函数不知道哪里错了~~~
{
int key = arr[begin];
int left = begin -1;
int right = end + 1;
while(true)
{
do{
--right;
}while(left < right && arr[right] > key);
do{
++left;
}while(left < right && arr[left] <= key);
if(left < right) //如果向右和向左都扫到了一个和key相等的元素呢?这种排序就会出现错误
{
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
}
else
{
return right;
}
}
}*/
int partition(int arr[], int low, int high)
{
int key = arr[low];
while(low < high)
{
while((low < high) && (arr[high] > key))
high-- ;
arr[low] = arr[high];
while( (low<high) && (arr[low] <= key))
low++ ;
arr[high] = arr[low];
}
arr[low] = key;
return low;
}
int partition1(int arr[], int begin, int end)
{
srand((unsigned)time(NULL));
int element = rand()%(end-begin+1) + begin;
int tmp;
tmp = arr[end]; arr[end]= arr[element]; arr[element] = tmp;
int i = begin-1; int j;
int key = arr[end];
for(j = begin; j<end; j++)
{
if(arr[j] <= key)
{
tmp = arr[i+1];
arr[i+1] = arr[j];
arr[j] = tmp;
++i;
}
}
tmp = arr[end];
arr[end] = arr[i+1];
arr[i+1] = tmp;
//cout << " value of i: " << i << endl;
return i+1;
}
//递归快排
void quick_sort(int arr[], int begin, int end)
{
if(begin < end)
{
int r = partition1(arr, begin, end);
/*cout << "r " << r << " begin " << begin << " " << end << endl;
for(int i =begin; i< end; i++)
cout << arr[i] << " ";
cout << endl;*/
quick_sort(arr, begin, r-1);
quick_sort(arr, r+1, end);
}
}
//非递归快排
void quick_Sort_stack(int arr[], int left, int right)
{
vector< pair<int, int> > stac;
pair< int , int > tmp;
int r = partition1(arr, left, right);
if(r > left+1)
{
tmp = make_pair(left, r-1);
stac.push_back(tmp);
}
if(right > r+1)
{
tmp = make_pair(r+1, right);
stac.push_back(tmp);
}
while( !stac.empty() )
{
pair<int, int> read;
read = stac[stac.size()-1];
r = partition1(arr, read.first, read.second);
//cout << "first " << read.first << " second " << read.second << endl;
stac.pop_back();
if(r > read.first+1)
{
tmp = make_pair( read.first, r-1);
stac.push_back(tmp);
}
if( read.second > r+1)
{
tmp = make_pair( r+1, read.second);
stac.push_back(tmp);
}
}
}
int main()
{
int length = 0;
int *arr;
int i;
cout << "input the length of array" << endl;
scanf("%d", &length);
arr = (int *)malloc(sizeof(int) * length);
for(i=0; i< length; i++)
{
arr[i] = rand()%100;
cout << arr[i]<< " " ;
}
cout << endl;
//quick_sort(arr, 0, length-1);
quick_Sort_stack(arr, 0, length-1);
for(i=0; i< length; i++)
{
cout << arr[i]<< " " ;
}
cout << endl;
return 0;
}