應用交換排序基本思想的主要排序方法有:冒泡排序和快速排序。這裏將主要介紹快速排序,以及快速排序的遞歸與非遞歸的實現和對快速排序的優化
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);
}
}
}
}