编程基本算法(二)

在写此文章之前,笔者想说说关于程序员的基本知识,好多园友在博客园上谈论自己的工作经历,或者给毕业生的建议,笔者很赞同期中园友建议在同学在学校里将计算机基础打好,没有良好基础怎么能建大厦呢?有了一些基础基本知识,在去学习深的理论就是事半功倍了,如果是先遇到深理论在去学习相关的基础,那就是事倍功半了。也许许多同学会说,现在的很多企业都招能直接上手的,笔者首先想说那种企业肯定是小企业,鼠目寸光,招也找不到很优秀的人才,就算去了,这种人才也不会呆很长时间,因为这种企业没有发展的远见,有技术的人才可能因没发展前途而跳槽。其次笔者想说如果你有良好的计算机基础,笔者相信你能成功在三个月之内学习适应达到企业技术要求。

其实,笔者想表达任何时候不要忽略基础。闲话不多说了,直接转基本排序算法。

编程基本算法(一)

编程基本算法(二)

编程基本算法(三)

冒泡排序

使用条件:集合的元素可对比大小

算法思想:连续地扫描待排序的记录,每扫描一次,都会找出最小记录,使之更接近顶部。由于每次扫描都会把一条记录置于它的最终最正确的位置,因此下次扫描不需要重新检查这条记录

举例编程:int b[10]={77,1,65,13,81,93,10,5,23,17}将其冒泡排序(这里笔者将概念弄混淆了,感谢zdd的指出

// 冒泡排序
void Bubble( int b[ 10 ])
{
int temp;
int i;
for (i = 9 ;i > 0 ;i -- )
{
for ( int j = 0 ;j < i;j ++ )
{
if (b[j] > b[j + 1 ])
{
temp=b[j];
                b[j]=b[j+1];
                b[j+1]=temp;
       }
}
}
cout
<< " the sort is: " ;
for ( int i = 0 ;i < 10 ;i ++ )
{
cout
<< b[i] << " " ;
}
cout
<< endl;
}

性能分析:时间复杂度O(n^2)

希尔排序

使用条件:集合的元素可对比大小

算法思想:先将整个待排记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序“时,在对全体记录进行一次直接插入排序。子序列构成的不是简单“逐段分割”,而是相隔某个“增量”的记录组成一个子序列。因此比较排序时候关键字较小的记录就不是一步一步往前挪动,而是相隔一定增量移动,该“增量”呈现一个递减趋势,最后这个“增量”总是为1,那么此时序列已基本有序,只要作少量的比较和移动几个完成排序。希尔排序不好把握增量的设定。一般8个数我们认为设定“增量”为:4,2,1。(这是一般希尔排序的设定)。那么笔者这里要拟定一个求“增量”的公式 h(n+1)=3*h(n)+1,(h>N/9停止)这个公式可能选择增量不是最合适,但是却适用一般“增量”的设定。如果是8个数的话,那么这里增量就是1。

举例编程:int b[10]={77,1,65,13,81,93,10,5,23,17}将其希尔排序

// 希尔排序自增量需要自己合适选择
void ShellSort( int b[ 10 ])
{
int h,i;
int n = 10 ;
// 通过这个循环算出增量为1和4
for (h = 1 ;h <= n / 9 ;h = 3 * h + 1 );

// 增量循环
for (;h > 0 ;h /= 3 )
{
for (i = h;i < n;i ++ )
{
int j,temp;
temp
= b[i];
// 插入排序
for (j = i - h;j >= 0 ;j = j - h)
{
if (b[j] > temp)
{
b[j
+ h] = b[j];
}
else
{
break ;
}
}
b[j
+ h] = temp;
}
}
cout
<< " the sort is: " ;
for ( int i = 0 ;i < 10 ;i ++ )
{
cout
<< b[i] << " " ;
}
cout
<< endl;
}

性能分析:时间复杂度对于希尔排序就有点复杂,它根据具体的“增量”不同而不同,这里笔者采用严蔚敏《数据结构》的O(n^3/2)

快速排序

使用条件:可对比大小的集合。

算法思想:通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则可分别对这两部分记录继续这种排序,最后达到有序序列。这里有一个关键点,就是选取分割的“基准”。肯定是大于这个“基准”分成一个部分,小于这个“基准”分成一个部分。这里笔者默认取该部分第一个记录为“基准”。

举例编程:int b[10]={77,1,65,13,81,93,10,5,23,17}

// 快速排序
void QuickSort( int * b, int low, int high)
{
// 交换函数
void Sawp( int * a, int * b);
int Old_low = low;
int Old_high = high;
while (low < high)
{
while ( * (b + high) >=* (b + low) && low < high)high -- ;
Sawp(b
+ low,b + high);
while ( * (b + low)= <* (b + high) && low < high)low ++ ;
Sawp(b
+ low,b + high);
}
if (Old_low < low - 1 )
{
QuickSort(b,Old_low,low
- 1 );
}
if (high + 1 < Old_high)
{
QuickSort(b,high
+ 1 ,Old_high);
}
}

// 交换函数
void Sawp( int * a, int * b)
{
int temp;
temp
=* a;
* a =* b;
* b = temp;
}

性能分析:时间复杂度O(nlogn)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值