1.快速排序(不穩定)
int Partition(vector<int> &v, int p, int r)
{
int x = v[r];//選取最後一個元素作爲參照
int i = p - 1, j = p;
for(; j < r; j++)
{
if(v[j] <= x)
{
i++;
swap(v[j], v[i]);
}
}
swap(v[r], v[i+1]);
return i+1;
}
void QuickSort(vector<int> &v, int p, int r)
{
int q;
if(p < r)
{
q = Partition(v, p, r);
QuickSort(v, p, q - 1);
QuickSort(v, q + 1, r);
}
}
時間複雜度:最壞O(n^2),平均O(nlgn),空間複雜度O(1)。
2. 最快的穩定排序(歸併排序)
//將兩個有序部分(left——mid,mid+1——right)合併
void Merge(vector<int> &v, int left, int mid, int right)
{
vector<int> temp;
int i = left, j = mid + 1, k;
while(i <= mid && j <= right)
{
if(v[i] <= v[j])
temp.push_back(v[i++]);
else
temp.push_back(v[j++]);
}
while(i <= mid)
temp.push_back(v[i++]);
while(j <= right)
temp.push_back(v[j++]);
for(k = 0; k < temp.size(); k++)
v[left + k] = temp[k];
}
void MergeSort(vector<int> &v, int p, int r)
{
int mid;
if(p < r)
{
mid = (p + r) / 2;
MergeSort(v, p, mid); //分解部分
MergeSort(v, mid + 1, r);
Merge(v, p, mid, r);
}
}
時間複雜度:最壞、平均複雜度:O(nlogn),空間複雜度:O(n)。