【算法】經典排序

1.平均表現最優的快排

  • 時間複雜度O(NlogN)

  • 空間複雜度O(1)

  • 缺點:不是穩定的,會交換值相同的元素的位置

void swap(int *a, int *b)
{
	if (a==NULL || b==NULL || a==b || *a=*b)
		return;

	int tmp = *a;
	*a = *b;
	*b = tmp;
}

int partition(int a[], int size, int left, int right)
{
	if (a==NULL || size<=0 || left>=right)
		return -1;

	int i = left;
	int j = right+1;
	int pivot = a[left];
	while (i<j)
	{
		while (a[++i]<pivot) {
			if (i==right)
				break;
		}
		while (a[--j]>pivot) {
			if (j==left)
				break;
		}

		if (i>=j)
			break;

		swap(&a[i], &a[j]);
	}

	swap(&a[left], &a[j]);

	return j;
}

void QSort(int a[], int size, int left, int right)
{
	if (size<=0 || left>=right)
		return;

	int pindex = partition(a, size, left, right);
	QSort(a, size, left, pindex-1);
	QSort(a, size, pindex+1, right);
}

void qsort(std::vector<int> &nums)
{
	int size = nums.size();
	if (size<=1) return ;

	QSort(&nums[0], size, 0, size-1);
}

2.穩定排序首選歸併排序

  • 時間複雜度O(NlogN)

  • 空間複雜度O(N)

  • 缺點:空間複雜度相對較高,需要額外數組大小的空間

void merge(int a[], int size, int tmp[], int left, int mid, int right)
{
	if (a==NULL || size<=0 || left>=right)
		return	;

	int i = left;
	int j = mid+1;
	int k = left;
	while (i<=mid && j<=right)
	{
		if (a[i]<a[j])
		{
			tmp[k++] = a[i++];
		} else {
			tmp[k++] = a[j++];
		}
	}

	while (i<=mid) tmp[k++] = a[i++];
	while (j<=right) tmp[k++] = a[j++];

	while (left<=right)
	{
		a[right] = tmp[right];
		right--;
	}
}

void MSort(int a[], int size, int tmp[], int left, int right)
{
	if (a==NULL || size<=0 || left>=right) return;

	int mid = left + (right-left)/2;
	MSort(a, size, tmp, left, mid);
	MSort(a, size, tmp, mid+1, right);
	merge(a, size, tmp, left, mid, right);
}

void mergeSort(std::vector<int> &nums)
{
	int size = nums.size();
	if (size<=1) return	;

	std::vector<int> tmp(size, 0);
	MSort(&nums[0], size, tmp, 0, size-1);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章