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

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)。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章