今天在这里就记录下简单的冒泡排序,接下来的几天,我会和大家一起分享下我对排序的一些理解和认识;
冒泡排序:
给出实际序列;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 0 9 6 2 4);
j=3 , 9>6 重复上述操作, 进行交换将 9 放到后面,6放到前面;
(此时的序列为: 8 70 6 9 2 4);
j=4 , 9>2 重复上述操作, 进行交换将 9 放到后面,2放到前面;
(此时的序列为: 8 70 6 2 9 4);
j=5 , 9>4 重复上述操作, 进行交换将 9 放到后面,4放到前面;
(此时的序列为: 8 70 6 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
还会持续更新中,请小伙伴继续关注我的博客: