您的位置:首页 > 其它

OJ中常用的功能函数(排序)

2014-08-14 17:31 253 查看
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)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  排序 acm