排序小结(持续更新中。。。)

今天在这里就记录下简单的冒泡排序,接下来的几天,我会和大家一起分享下我对排序的一些理解和认识;

冒泡排序

给出实际序列;9 8 7 0 6 2 4;个数n=7;

给出一个 6 个数的序列,要求我们对其进行升序,我们可以有很多的排序方法来解决这个问题;这里的话,我先来和大家分享下冒泡排序;

冒泡排序:顾名思义,就是像鱼儿吹泡泡一个个冒出来一样,所以冒泡排序的本质其实是序列中相邻的两个数进行的操作,按题目所给的要求就是对其进行升序排序,那么我们就要将最大的数字放到最后面;那么我们只要每次要求从第一个数开始相邻的两个数之间进行比较,将大的数放后面,小的数放前面;

例如:第一次遍历比较:

    j=0  ,   9>8  9和8  进行交换将 9 放到后面,8放到前面;

(此时的序列为: 8 9 7 0 6 2 4);

    j=1 ,   9>7  (因为此时9是在原来8的位置上,所以现在比较的相邻的两个数,实际上是9和7),重复上述操作, 进行交换将 9 放到后面,7放到前面;

(此时的序列为: 8 7 9 0 6 2 4);

    j=2 ,   9>0 重复上述操作, 进行交换将 9 放到后面,0放到前面;

(此时的序列为: 8 7 9 6 2 4);

    j=3 ,   9>6 重复上述操作, 进行交换将 9 放到后面,6放到前面;

(此时的序列为: 8 76 9 2 4);

    j=4 ,   9>2  重复上述操作, 进行交换将 9 放到后面,2放到前面;

(此时的序列为: 8 76 2 9 4);

    j=5 ,   9>4  重复上述操作, 进行交换将 9 放到后面,4放到前面;

(此时的序列为: 8 76 2 4 9);

当我们第二次遍历的时候 9 就不需要进行比较了,因为它已经是最大的数了;所以给次遍历的结束条件为 n - j;

接着直到所有的相邻的数字都冒泡完,升序排序也就出来了:


最后得出了冒泡排序的最终结果;

给出冒泡排序的代码:

void Buble_sort(int n,int num[])
{
	//int count = 1;
	for (int i = 1; i <= n; i++)
	{
		for (int j = 0; j < n-i; j++)
		{
			if (num[j]>num[j + 1])Swap(num[j], num[j + 1]);//如果大于就交换;
		}		
		//cout << "第" << count++ << "次排序结果: ";
		//for (int x = 0; x < n; x++)
		//	cout << num[x] << " ";
		//cout << endl;
	}
}

给出自己写的交换函数,这个函数在#include<algorithm>里面是有的:

void Swap(int &a, int &b)//交换函数;
{
	int t = a;
	a = b;
	b = t;
}


如果想要得到降序的话,只需要将判断条件给变下就好了,改成    if (num[j]<num[j + 1])  

需要注意的是,这里没有用到等于(=)号,的判断条件,也就是说,碰到了相同的,实际上他是不会交换的,也就是保证了其位置的相对稳定性;

这里的话,冒泡排序的时间效率是O(N^2);

——2016.01.20


选择排序:

选择排序,也正如其名字一样,选择序列中的情况然后对其进行排序;

思路,我们每一次选择最大(降序排序)或者最小(升序排序)的一个与其序列的第一个数字进行交换的方法叫做选择排序;

还是拿上面的列子来讲: 9 8 7 0 6 2 4

那么第一趟排序的情况就是,找到了第一个最小的元素与第一个进行交换,则序列变成(0 8 7 9 6 2 4);

第二趟排序的结果: 0 2 7 9 6 8 4

第三趟排序的结果: 0 2 4 9 6 8 7

第四趟排序的结果: 0 2 4 6 9 8 7

第五趟的排序结果: 0 2 4 6 7 8 9

。。。。。。。。。。。。。。。

给出选择排序的代码:

void Section_sort(int n,int num[])
{
	
	for (int i = 0; i < n-1; i++)
	{
		int min = num[i];
		int x = i;
		for (int j = i + 1; j < n; j++)
		{
			if (num[j] < min)
			{
				min = num[j];
				x = j;   //记录要交换的元素的下标;
			}
		}
		Swap(num[i], num[x]);//将选择出来的交换的元素进行交换
	}
}

 ——2016.01.22

还会持续更新中,请小伙伴继续关注我的博客:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值