转贴 重温数据结构——排序算法

重温数据结构——排序算法[@more@]正休息天,自感所学荒疏,拿起书本重新复习一下排序算法,通常我们指的排序是内部排序,是指整个排序过程中,数据全部存放在计算机的内存储器中,并且在内存储器中调整记录间的相对位置。依据不同原则对内部排序方法进行分类,则主要有:
一、插入排序

二、交换排序
所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置。交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。
  A.冒泡排序
当把一个数组设想成一个垂直的柱体,其中按最小的元素在顶部,最大的元素在底部排序时,冒泡排序算法最容易理解了。数组从底部往上扫描,如果相邻两个元素逆序,则将两者交换。其具体做法是:先将第一个记录的键值和第二个记录的键值进行比较,如r[1].key>r[2].key,则将两个记录交换。然后比较第二个和第三个记录的键值;依次类推,直到第n-1个记录和第n个记录进行比较交换,这称为一趟起泡。此时最明显的效果是将键值最大的记录换到了最后。然后,对前n-1个记录进行同样操作,则次大键值的记录就被置于第n-1个位置上。重复以上过程,直至没有记录需要交换为止即已经完成整个排序 过程。

算法如下:

template
void bubblesort(T data[],int n) {
for(int i=0;i for(int j=n-1;j>i;--j)
if(data[j] swap(data[j],data[j-1]);
}

算法中比较的次数在各种条件下都是相同的(最好,一般和最坏),都等于内层for循环迭代的总的次数:

n(n-1)/2=O(n2)

上面公式也计算出了最坏情况(也就是数组完全逆序情况)下交换的次数,在这种情况下,必须移动3(n(n-1)/2)次。冒泡排序的主要缺点就是它需要一步一步地向上冒泡直到数组的顶部,这是非常费时的。

   B.快速排序
其基本思想是:在待排序的n个记录中任取一个记录(确切地说,这个边界值的选择还是有些策略的,视情况可以选取第一个记录值或中间记录等),以该记录的键值为标准,将所有记录分为两组,使得第一组中各记录的键值均小于或等于该键值,第二组中各记录的键值均大于该键值。然后把该记录就排在这两组的中间。此称为一趟快速排序,对所分成的两组分别重复上述方法,直到所有记录都排在适当的位置为止。
While(lower template
void quicksort(T data[],int first,int last){
int lower=first++,upper=last;
swap(data[first],data[(first+last)/2];
T bound=data[first];
while(lower<=upper) {
while(data[lower] lower++;
while(bound upper--;
if(lower swap(data[lower++],data[upper--]);
else lower++;
}
swap(data[upper],data[first])
if(first quicksort(data,first,upper-1);
if(upper+1 quicksort(data,upper+1,last);
}

template
void quicksort(T data[],int n) {
if(n<2)
return;
for(int i=1,max=0;i if(data[max])
max=i;
swap(data[n-1],data[max]);
quicksort(data,0,n-2);
}

快速排序是不稳定的,从平均时间性能而言,快速排序最佳,其时间复杂度为O(n log2n)。但在最坏情况下,即几乎是排好序的序列,该算法的效率很低,近似于O(n2)。而且快速排序算法不适合对小型序列进行排序,对于少于10个数据项的小序列来说,插入排序比快速排序更加有效。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9757269/viewspace-913188/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/9757269/viewspace-913188/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值