您的位置:首页 > 其它

一步一步写算法(之非递归排序)

2012-02-21 21:20 316 查看
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

在上面一篇博客当中,我们发现普通查找和排序查找的性能差别很大。作为一个100万的数据,如果使用普通的查找方法,那么每一个数据查找平均下来就要几十万次,那么二分法的查找呢,20多次就可以搞定。这中间的差别是非常明显的。既然排序有这么好的效果,那么这篇博客中,我们就对排序算做一个总结。

按照我个人的理解,排序可以分为两种:一种是非递归排序,它主要按照非递归的方法对数据进行排序,也就是说主要数据的移位和循环来完成;另外一种就是递归方法,我们在排列当前数据的时候首先把子数据排列有序,然后才会排列当前的数据。这种不断递归调用的方法就是递归排序。

非递归排序的方法很多,这里主要介绍冒泡排序、插入排序、希尔排序;递归的方法也不少,这里介绍的方法是快速排序、归并排序和堆排序。排序的内容很多,本篇博客主要介绍非递归排序,递归排序的内容主要在下一节内容解决。

(1)冒泡排序

冒泡排序的内容并不复杂。假设有n个数据需要排序,那么我们需要确定n个从大到小的数据,每一次都挑选第n大的数据是多少,并且放大相应的位置。直到所有的数据都排列整齐了,那么我们的排序就结束了。

[cpp]
view plaincopyprint?

void bubble_sort(int array[],
int length)
{
int inner = 0, outer = 0;

int median = 0;

if(NULL == array || 0 == length)

return;

for(outer = length-1; outer >= 1; outer --){

for(inner = 0; inner < outer; inner ++){

if(array[inner] > array[inner + 1]){

median = array[inner];
array[inner] = array[inner + 1];
array[inner + 1] = median;
}
}
}
}

[cpp]
view plaincopyprint?

void bubble_sort(int array[],
int length)
{
int inner = 0, outer = 0;

int median = 0;
int flag = 1;

if(NULL == array || 0 == length)

return;

for(outer = length-1; outer >= 1 && flag; outer --){

flag = 0;

for(inner = 0; inner < outer; inner ++){

if(array[inner] > array[inner + 1]){

median = array[inner];
array[inner] = array[inner + 1];
array[inner + 1] = median;

if(flag == 0)

flag = 1;
}
}
}
}

void bubble_sort(int array[], int length)
{
int inner = 0, outer = 0;
int median = 0;
int flag = 1;

if(NULL == array || 0 == length)
return;

for(outer = length-1; outer >= 1 && flag; outer --){
flag = 0;

for(inner = 0; inner < outer; inner ++){
if(array[inner] > array[inner + 1]){
median = array[inner];
array[inner] = array[inner + 1];
array[inner + 1] = median;

if(flag == 0)
flag = 1;
}
}
}
}


(2) 插入排序

插入排序的意思就是说,我们把数据分成两个部分,一部分是已经排好序的数据,一部分是当前还没有完成排序的数据。那么这么说来的话,排序的过程是不是就是把没有排序的数据逐个插入到已经排好序的队列中的过程呢。大家可以自己先试一下,然后再看看我的代码对不对?

[cpp]
view plaincopyprint?

void insert_sort(int array[],
int length)
{
int inner = 0;

int outer = 0;
int median = 0;

if(NULL == array || 0 == length)

return;

for(outer = 1; outer <length; outer ++){

for(inner = outer; inner >= 1; inner --){

if(array[inner] < array[inner -1]){

median = array[inner];
array[inner] = array[inner -1];
array[inner -1] = median;
}else{

break;
}
}
}
}

[cpp]
view plaincopyprint?

void shell_sort(int array[],
int length, int step)

{
int inner = 0;

int outer = 0;
int median = 0;

if(NULL == array || 0 == length)

return;

for(; step >= 1; step -=2){

for(int index = 0; index < step; index ++){

if((length -1) < (index + step))

continue;

else{
outer = index + step;
while( (outer + step) <= (length - 1))

outer += step;
}

for(;  outer >= (index + step);  outer -= step){

for(inner = index; inner <= outer - step; inner += step){

if(array[inner] >= array[inner + step]){

median = array[inner];
array[inner] = array[inner + step];
array[inner + step] = median;

}
}
}
}
}
}

void shell_sort(int array[], int length, int step)
{
int inner = 0;
int outer = 0;
int median = 0;

if(NULL == array || 0 == length)
return;

for(; step >= 1; step -=2){
for(int index = 0; index < step; index ++){
if((length -1) < (index + step))
continue;
else{
outer = index + step;
while( (outer + step) <= (length - 1))
outer += step;
}

for(;  outer >= (index + step);  outer -= step){
for(inner = index; inner <= outer - step; inner += step){
if(array[inner] >= array[inner + step]){
median = array[inner];
array[inner] = array[inner + step];
array[inner + step] = median;
}
}
}
}
}
}


总结:

(1)上面的排序都是非递归程序,理解上不难,但是细节问题需要注意,特别是长度的问题

(2)代码编写的时候务必注意测试用例的设计

(3)如果可能的情况下,多使用已经验证的代码和函数

【预告: 下一篇博客介绍快速排序的内容】
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: