- 1、本文档共25页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
MoreWindows 白话经典算法之七大排序(第
2 版)
这是本人在研一上课时所整理的文档,包括冒泡排序,直接
插入排序,直接选择排序,希尔排序,归并排序,快速排序和堆
排序这七种常用的排序方法,这些文章不仅使我在考试中取了不
错的成绩,也为后来顺利面过迅雷,腾讯,微软打下了良好的基
础,现在整理成电子书形式,希望能对大家有所帮助。第2 版新
加入了总结篇,有助于大家的复习。
白话经典算法之七大排序目录
1.白话经典算法系列之一 冒泡排序的三种实现
2. 白话经典算法系列之二 直接插入排序的三种实现
3. 白话经典算法系列之三 希尔排序的实现
4. 白话经典算法系列之四 直接选择排序
5. 白话经典算法系列之五 归并排序的实现
6. 白话经典算法系列之六 快速排序 快速搞定
7. 白话经典算法系列之七 堆与堆排序
8. 白话经典算法系列之总结篇
By MoreWindows (/MoreWindows)
该文档版权归MoreWindows 所有(morewindows@126.com ) ,欢迎大家访问我的博客。
一.白话经典算法系列之一 冒泡排序的三种实现
冒泡排序是非常容易理解和实现,以从小到大排序举例:
设数组长度为N 。
1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交
换。
2 .这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就
“沉”到数组第N-1个位置。
3 .N=N-1,如果N不为0就重复前面二步,否则排序完成。
按照定义很容易写出代码:
// 冒泡排序1
void BubbleSort1(int a[], int n)
{
int i, j ;
for (i = 0; i n; i++)
for (j = 1; j n - i; j ++)
if (a[j - 1] a[j ])
Swap(a[j - 1], a[j ]);
}
下面对其进行优化,设置一个标志,如果这一趟发生了交换,则为true ,否则为
false 。明显如果有一趟没有发生交换,说明排序已经完成。
// 冒泡排序2
void BubbleSort2(int a[], int n)
{
int j , k;
bool flag;
k = n;
flag = true;
while (flag)
{
flag = false;
for (j = 1; j k; j ++)
if (a[j - 1] a[j ])
{
Swap(a[j - 1], a[j ]);
flag = true;
}
k--;
}
}
再做进一步的优化。如果有100个数的数组,仅前面10个无序,后面90个都已排
好序且都大于前面10个数字,那么在第一趟遍历后,最后发生交换的位置必定小
于10,且这个位置之后的数据必定已经有序了,记录下这位置,第二次只要从数
组头部遍历到这个位置就可以了。
// 冒泡排序3
// By MoreWindows (/MoreWindows)
void BubbleSort3(int a[], int n)
{
int j , k;
int flag;
flag = n;
while (flag 0)
{
k = flag;
flag = 0;
for (j = 1; j k; j ++)
if (a[j - 1] a[j ])
{
Swap(a[j - 1], a[j ]);
flag = j ;
}
}
}
冒泡排序毕竟是一种效率低下的排序方法,在数据规模很小时,可以采用。数据
规模比较大时,最好用其它排序方法。
二.白话经典算法系列之二 直接插入排序的三种实现
直接插入排序(Insertion Sort) 的
文档评论(0)