您的位置:首页 > 理论基础 > 数据结构算法

快速排序{不同方法寻找分割元素}

2011-10-06 00:00 246 查看
本文主要阐述快速排序中分割元素的划分。

#include <iostream>
using namespace std;

//Swap交换函数,若用异或则要注意判断a==b?
//若用加减法,则要注意防止溢出现象。综合看判断+异或较好。
void Swap(int &a, int &b)
{
if (a == b)
{
return;
}
a = a^b;
b = a^b;
a = a^b;
}

//第一种分割办法,算法导论上快速排序即采用此方法
//从一端开始寻找分割点
/*
示意图
[low-----i-------j------high]
i:指示的是当前从l~i之间都是小于或等于 x=data[high];
j:i~j之间的都是 大于或等于x
最后将i+1位置的元素和主元x交换,则主元被交换到i+1位置,则i+1就成了分割位置
*/
//**************做了随机化处理******************
int Partition1(int data[],int low, int high)
{
int k = low + rand() % (high-low+1);//做下随机处理
//为了取得low~high内平均,必须mod(high-low + 1)
Swap(data[k],data[high]);             //因为主元是选择最后一个元素

int pivot = data[high];
int i=low-1;//i记录的是比主元小的元素的下标上限。初始为low-1
for (int j=low;j<high;j++)
{
if (data[j] <= pivot)/*容易把等号丢掉*/
{	//有比主元小或等于主元的元素,则i++
i++;
Swap(data[i], data[j]);//可能存在自己和自己交换
}
}

/*Swap(data[i+1], pivot);*///这里容易写错
Swap(data[i+1], data[high]);
return i+1;
}

/*第2种写法和第3种写法,都选取low位置元素为主元
且这两种写法都是从两端开始寻找分割点
*/
//分割元素写法2
//第二种分割办法
int Partition2(int data[], int low, int high)
{
int i=low;//i从左端往右
int j=high;//j从右端往左
int pivot = data[low];//选取low位置处为主元

while(i<j)
{
//找第一个比pivot小的元素
while(data[j] >= pivot && i<j)//当i==j时就停止
j--;
data[i] = data[j];

//找第一个比pivot大的元素
while(data[i] <= pivot && i<j)//当i==j时也停止了
i++;
data[j] = data[i];
}

data[i] = pivot;//i和j相等位置即为分割点。
return i;
}

//分割元素第三种写法
//参考陈慧楠老师<<数据结构>>
int Partition3(int data[], int low, int high)
{
int i,j;
i = low;//令l为主元值
j = high+1;
int pivot = data[low];

if (low < high)
{
do
{
do i++; while(data[i] < pivot && i <= high);//避免越界
do j--; while(data[j] > pivot );//因为无论如何会有data[j] == data[i]处结束
if (i<j)
Swap(data[i], data[j]);
} while (i<j);
}

Swap(data[low], data[j]);
return j;
}

int Partition4(int data[], int low, int high)
{
int i,j;
i = low;//令l为主元值
j = high;
int pivot = data[low];

if (low < high)
{
while(i<j)
{
while(data[i] <= pivot && i<high) i++;
while(data[j] >= pivot && j>low ) j--;
if(i<j)
Swap(data[i], data[j]);
}
}

Swap(data[low], data[j]);
return j;
}

void QSort(int data[], int low, int high)
{
if (low<high)//没有等于号
{
//int k = Partition1(data, low, high);//分割元素
//int k = Partition2(data, low, high);//分割元素
//int k = Partition3(data, low, high);//分割元素
int k = Partition4(data, low, high);//分割元素
QSort(data, low, k-1);
QSort(data, k+1, high);
}
}

void QuickSort(int data[], int n)//在用户端容易调用
{
QSort(data,0,n-1);
}
int main()
{
int array[10] = {1,3,41,2,23,121,1231,123,12,5};//
QuickSort(array,10);

for (int i=0;i<10;i++)
{
cout<<array[i]<<endl;
}
return 1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  pivot 数据结构 算法