排序方法总结

1.选择排序(时间复杂度固定为为O(n*n)与输入的数组内部顺序无关,数据移动是最少的,但不稳定)

基本思想是首先将第一个和后面的元素比较将最小的放在第一个,然后将第二个同样操作。

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

}

int main()
{
	int a[] = { 1,5,6,76,54,43,23,2,45,45 };
	int n = sizeof(a) / sizeof(int);
	cout << n << endl;
	select_Sort(a,n);
	for (int i = 0; i < n; i++) {
		cout << " "<<a[i];
	}
	system("pause");

}

2.插入排序(插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。)

基本思想:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。

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

int main()
{
	int a[] = { 33,25,47,23,8,13,68,90,23,1,2,1,3,1,3,4,3,2};//输入数组
	int n = sizeof(a) / sizeof(int);
	sort(a, n);
	for (int i = 0; i < n; i++)
		cout << a[i] << "   ";
	system("pause");
}

3.冒泡排序

基本思想:比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

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

int main()
{
	int a[] = { 33,25,47,23,8,13,68,90,23,1,2,1,3,1,3,4,3,2};//输入数组
	int n = sizeof(a) / sizeof(int);
	sort(a, n);
	for (int i = 0; i < n; i++)
		cout << a[i] << "   ";
	system("pause");
}

4.希尔排序(不稳定的算法,对于中等规模的数据建议使用希尔排序,大型规模的就使用后面讲到的更高效的算法)

基本思想:算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。 一般的初次取序列的一半为增量,以后每次减半,直到增量为1。 给定实例的shell排序的排序过程 假设待排序文件有10个记录,其关键字分别是: 49,38,65,97,76,13,27,49,55,04。 增量序列的...

void sort(int a[], int n)
{
	int gap = n / 2;
	while (gap)
	{
		for (int i = gap; i < n ; i++)
		{
			for (int j = i; j >= gap; j -= gap)
			{
				if (a[j] < a[j - gap])   swap(a[j], a[j - gap]);
			}
		}
		gap = gap / 2;
	}
}

int main()
{
	int a[] = { 33,25,47,23,8,13,68,90,23,1,2,1,3,1,3,4,2,5,3};//输入数组
	int n = sizeof(a) / sizeof(int);
	cout << n << endl;
	sort(a, n);
	for (int i = 0; i < n; i++)
		cout << a[i] << "   ";
	system("pause");
}

 

5.归并排序

void Merge(int *a, int p, int q, int r)
{
	int n1 = q - p + 1;       //左部分的的元素个数
	int n2 = r - q;           //同上
	int i, j, k;
	int *L = new int[n1 + 1];
	int *R = new int[n2 + 1];
	for (i = 0; i < n1; i++)
		L[i] = a[p + i];
	for (j = 0; j < n2; j++)
		R[j] = a[q + j + 1];
	L[n1] = 11111111;
	R[n2] = 11111111;
	// 数组L从0~n1-1存放,第n1个存放int型所能表示的最大数,即认为正无穷,这是为了
	//处理合并时,比如当数组L中的n1个元素已经全部按顺序存进数组a中,只剩下数组R的
	//部分元素,这时因为R中剩下的元素全部小于11111111,则执行else语句,直接将剩下的
	//元素拷贝进a中。
	for (i = 0, j = 0, 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 l, int r)
{
	if (l < r)
	{
		int m = (l + r) / 2;
		MergeSort(a, l, m);
		MergeSort(a, m + 1, r);
		Merge(a, l, m, r);
	}
}

//附上主函数
int main()
{
	int i;
	int a[11] = { 2,5,8,8,66,33,2,12,0,56,20 };
	for (i = 0; i < 11; i++)
		cout << a[i] << " ";
	cout << endl;
	MergeSort(a, 0, 10);
	for (i = 0; i < 11; i++)
		cout << a[i] << " ";
	cout << endl;
	system("pause");
}

6.快速排序

void quickSort(int left, int right, int *arr)
{
	if (left >= right)
		return ;
	int i, j, base, temp;
	i = left, j = right;
	base = arr[left];  //取最左边的数为基准数
	while (i < j)
	{
		while (arr[j] >= base && i < j)
			j--;
		while (arr[i] <= base && i < j)
			i++;
		if (i < j)
		{
			temp = arr[i];
			arr[i] = arr[j];
			arr[j] = temp;
		}
	}
	//基准数归位
	arr[left] = arr[i];
	arr[i] = base;
	quickSort(left, i - 1, arr);//递归左边
	quickSort(i + 1, right, arr);//递归右边
}

int main()
{
	int i;
	int a[] = { 2,5,8,8,66,33,2,12,0,56,20,1,0,12,15,46,59,89,999,6556,45,0 };
	int n = sizeof(a) / 4-1;

	quickSort(0, n, a);

	for (i = 0; i < n+1; i++)
		cout << a[i] << " ";
	cout << endl;
	system("pause");
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值