黑马程序员_交换排序

             ----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

上一篇文章给大家介绍了插入排序,现在给大家解读一下交换排序,所谓交换,就是根据序列中两个元素关键字的比较结果来对换这两个记录在序列中的位置。基于交换的排序算法很多,其中我们主要是拿常用的两个排序算法进行考察,它们是冒泡排序和快速排序。

一、冒泡排序

冒泡排序的基本思路是:假设待排序表的表长是n,从后往前两两比较相邻的元素值,若为逆序(A[i-1]<A[i]),就交换它们,直到序列比较完成。我们称它为一趟冒泡,结果将最小的元素交换到待排序的的第一个位置,下一趟冒泡时,前一趟确定的最小元素不在参与比较,待排序序列减少一个元素,每趟冒泡的结果把序列中的最小元素放到子序列的最终位置,这样最多做n-1趟便完成排序。其核心代码为:

public void BubbleSort(int A[],int n){
for(i=0;i<n-1;i++){
flag=fslse;
for(j=n-1;j>1;j--)
if(A[j-1]>A[j])
flag=true;
}
if(flag==false)
return;
}  

它的性能如下:

空间效率:仅使用了常数个辅助单元,因而空间复杂度为O(l);

时间效率:平均时间复杂度为O(n2);

稳定性:是一个稳定的排序算法。

二、快速排序

快速排序是冒泡排序的一种改进,其基本思想是基于分治法,即选取一个元素pivot作为基准,通过一趟排序将待排序的元素分为两部分L[1.....k-1]和L[k+1.....n],使得L[1.....k-1]中所有的元素都小于pivot,L[k+1.....n]的元素都大于pivot,则pivot放在了最终的位置上L(k)上,这个过程称作一趟快速排序。此后一直重复,知道排序完成,其核心代码如下:

public void QuickSort(int A[],int low,int high){
if(low<high){
int pivotpos=Partition(A,low,high);
QuickSort(A,low,pivotpos-1);
QuickSort(A,pivotpos+1,high);
}
}  
 public int Partition(int A[],int low,int high){
int pivot=A[low];
while(low<high){
while(low<high&&A[high]>=pivot) --high;
A[low]=A[high];
while(low<high&&A[low]<=pivot) ++low;
A[high]=A[low];
}
A[low]=pivot;
return low;
 }

其性能如下:

空间效率:由于快速排序是递归的,所以在最坏的情况下为O(n),最好情况下为O(log2(n+1)),平均情况下为O(log2n);

时间效率:最坏情况下的时间复杂度为O(n2);

稳定性:快速排序是不稳定的算法。

以上便是选择排序的具体介绍,希望对大家能有很好的帮助,通过以上的东西,我也能很好的对于选择排序进行了理解,希望大家像话交流,感谢黑马程序平台。

----------------------- android培训java培训、java学习型技术博客、期待与您交流! ----------------------

详情请查看:http://edu.csdn.net/heima


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值