应用交换排序基本思想的主要排序方法有:冒泡排序和快速排序。这里将主要介绍快速排序,以及快速排序的递归与非递归的实现和对快速排序的优化
void BubbleSort(int* a, size_t n)
{
assert(n);
bool finish = false; //堆排序进行优化
size_t end = n;
while(end > 0) //end表示每次冒泡的终止位置
{
//单趟冒泡
for(size_t i=1; i<end; i++)
{
if(a[i-1]>a[i])
{
swap(a[i-1],a[i]);
finish = true; //若单趟排序有数据交换,则将finish置为true
}
}
if(finish == false) //判断单趟排序中是否有交换
{
return;
}
--end;
}
}
快速排序
//左右指针法 找一个key,将大数右移,小数左移,最后将数组区间划分为两部分 [] key []
int PartSort1(int* a, int begin, int end)
{
int left = begin, right = end; //right赋值为 end 还是 end-1
int key = a[right]; //选择最右边为key值
//单趟排序
while(begin < end)
{
//begin找大于
while(begin < end && a[begin] <= key) //注意条件a[begin] <= key
{
++begin;
}
//end找小
while(begin < end && a[end] >= key)
{
--end;
}
swap(a[begin], a[end]);
}
swap(a[begin],a[right]); //a[right]相当于中间划分的位置
return begin;
}
void QuickSort(int* a, int left, int right)
{
assert(a);
if(left >= right) //注意:结束条件的判断
{
return;
}
int div = PartSort1(a, left, right);
QuickSort(a, left,div-1);
QuickSort(a, div+1, right); //right为什么不-1;
}
void QuickSortFD(int* a, int left, int right)
{
stack<int> s; //栈中存放下标
if(left < right) //首先要保证下标有意义再压栈
{
s.push(right);
s.push(left);
}
while(s.size()>0)
{
int left = s.top();
s.pop();
int right = s.top();
s.pop();
if(right - left <= 20)
{
InsertSort(a+left,right-left+1);
return;
}
else
{
int div = PartSort1(a,left,right);
if(div - 1 >left) //区间不合法时,不入栈
{
s.push(div-1);
s.push(left);
}
if(right > div+1)
{
s.push(right);
s.push(left);
}
}
}
}