排序算法

排序算法

最坏情况下时间复杂度

最好情况下时间复杂度

平均时间

空间复杂度

稳定性

冒泡排序

O(n2)

O(n)

O(n2)

O(1)

稳定

选择排序

O(n2)

O(n2)

O(n2)

O(1)

不稳定

插入排序

O(n2)

O(n)

O(n2)

O(1)

稳定

希尔排序

O(n2)

O(n)

O(n1.3)

O(1)

不稳定

归并排序

O(nlog2n)

O(nlog2n)

O(nlog2n)

O(1)

稳定

快速排序

O(n2)

O(nlog2n)

O(nlog2n)

O(nlog2n)

不稳定

计数排序

O(n+k)

O(n+k)

O(n+k)

O(k)

稳定

冒泡排序

void BubbleSort(int a[], int n)
{
	for (int i = 0; i < n - 1; i++)
	{
		for (int j = 0; j < n - 1 - i; j++)
			if (a[j] > a[j + 1])
			{
				int temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp;
			}
	}
}

选择排序

void SelectSort(int a[], int n)
{
	for (int i = 0; i < n - 1; i++)
	{
		int min = i;
		for (int j = i + 1; j < n; j++)
			if (a[j] < a[min]) min = j;
		if (min != i)
		{
			int temp = a[i]; a[i] = a[min]; a[min] = temp;
		}
	}
}

插入排序

void InsertSort(int a[], int n)
{
	for (int j = 1; j < n; j++)
	{
		int key = a[j];
		int i = j - 1;
		while (i >= 0 && a[i] > key)
		{
			a[i + 1] = a[i];
			i = i - 1;
		}
		a[i + 1] = key;
	}
}

希尔排序

void ShellSort(int a[], int n)
{
	int gap;
	for (gap = 3; gap > 0; gap--)
	{
		for (int i = 0; i < gap; i++)
		{
			for (int j = i; j < n; j = j + gap)
			{
				cout << "a[" << j << "]:" << a[j] << " ";
				int key = a[j];
				int k = j - gap;
				while (k >= 0 && a[k] > key)
				{
					a[k + gap] = a[k];
					k = k - gap;
				}
				a[k + gap] = key;
			}
			cout << endl;
		}
		for (int i = 0; i < n; i++)
			cout << a[i] << " ";
		cout << endl;
	}
}

归并排序

void Merge(int A[], int p, int q, int r)
{
	int i, j, k;
	int n1 = q - p + 1;
	int n2 = r - q;
	int *L = new int[n1 + 1];
	int *R = new int[n2 + 1];
	for (i = 0; i < n1; i++)
		L[i] = A[i + p];
	for (j = 0; j < n2; j++)
		R[j] = A[j + q + 1];
	L[n1] = INT_MAX;
	R[n2] = INT_MAX; //若没有L[n1],L[n2],会有内存中的数据出现在排序中
	i = 0; j = 0;
	for (k = p; k <= r; k++)
	{
		if (L[i] <= R[j])
			A[k] = L[i++];
		else
			A[k] = R[j++];
	}
	delete[] L;
	delete[] R;
}
void MergeSort(int A[], int p, int r)
{
	if (p < r)
	{
		int q = (p + r) / 2;
		//递归过程,二路归并排序递归过程
		MergeSort(A, p, q);
		MergeSort(A, q + 1, r);
		//归并
		Merge(A, p, q, r);
	}
}

快速排序

int partition(int a[], int p, int r) //r表示数组的长度
{
	int x = a[r - 1];  //以最后一个数为基准
	int i = p - 1;
	for (int j = p; j < r - 1; j++)
	{
		if (a[j] <= x)
		{
			i++;
			if (i == j)
				continue;
			int temp = a[i]; a[i] = a[j]; a[j] = temp;
		}
	}
	int temp = a[i + 1]; a[i + 1] = a[r - 1]; a[r - 1] = temp;  //当j遍历完p到r-2时,交换a[r-1]与a[i+1]
	return i + 1;  
}
void QuickSort(int a[], int p, int r)
{
	if (p < r - 1)
	{
		int q = partition(a, p, r);
		QuickSort(a, p, q);
		QuickSort(a, q + 1, r);
	}
}

计数排序

void CountingSort(int a[], int n, int k)  //n个输入元素,每个都是0-k区间的一个整数
{
	int *c = new int[k + 1];
	int *b = new int[n];
	for (int i = 0; i < k + 1; i++)
		c[i] = 0;
	for (int j = 0; j < n; j++)
		c[a[j]] = c[a[j]] + 1; //共有c[a[j]]个数与a[j]相同
	for (int i = 1; i < k + 1; i++)
		c[i] = c[i] + c[i - 1];  //小于等于a[j]的数共有c[i]个
	for (int j = 0; j < n; j++)
	{
		b[c[a[j]] - 1] = a[j];
		c[a[j]] = c[a[j]] - 1;
	}
	delete[]c;
	delete[]b;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值