冒泡排序和选择排序以及插入排序的实现

冒泡排序和选择排序以及插入排序的实现

1. 冒泡排序(Bubble Sort)

是一种计算机科学领域的较简单的排序算法。

  • 比较相邻的元素。如果前一个元素比后一个元素大,就交换这两个元素的位置。
  • 对每一对相邻元素做同样的工作,从开始第一对元素到结尾的最后一对元素。最终最后位置的元素就是最大
    值。
public class Bubble {
	public Bubble(){
	}
	
	//对数组内的元素进行排序
	public static void sort(Comparable[] a){
		for(int i=0 ; i<a.length-1; i++){
			for (int j =0; j<a.length-i-1 ; j++){
				if(greater(a[j],a[j+1])){
					exch(a,j,j+1);
				}
			}
			
		}
	}
	//判断v是否大于w
	private static boolean greater(Comparable v,Comparable w){
	     return v.compareTo(w)>0;
	}
	//交换a数组中,索引i和索引j处的值
	private static void exch(Comparable[] a,int i,int j){
		Comparable temp = a[i];
		a[i] = a[j];
		a[j] = temp;
	}
}

冒泡排序的时间复杂度分析

  • 冒泡排序使用了双层for循环,其中内层循环的循环体是真正完成排序的代码, 所以我们分析冒泡排序的时间复杂度,主要分析一下内层循环体的执行次数即可。

元素比较的次数为:
(N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)(N-1)/2=N^2/2-N/2;
元素交换的次数为:
(N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)
(N-1)/2=N^2/2-N/2;
总执行次数为:
(N2/2-N/2)+(N2/2-N/2)=N^2-N;
按照大O推导法则,保留函数中的最高阶项那么最终冒泡排序的时间复杂度为O(N^2).

2.选择排序(Selection Sort)

选择排序是一种更加简单直观的排序方法。

  • .每一次遍历的过程中,都假定第一个索引处的元素是最小值,和其他索引处的值依次进行比较,如果当前索引处
    的值大于其他某个索引处的值,则假定其他某个索引出的值为最小值,最后可以找到最小值所在的索引
  • .交换第一个索引处和最小值所在的索引处的值
public class Selection {
	public Selection() {
	}
	//对数组内的元素进行排序
	public static void sort(Comparable[] a){
		for(int i =0; i<a.length-1 ; i++){
			int min = i;
			for(int j =i+1;j<a.length;j++){
				if(greater(a[min],a[j])){
					min=j;
				}
			}
			exch(a,min,i);
			
		}
	}
	//判断v是否大于w
	private static boolean greater(Comparable v,Comparable w){
		return v.compareTo(w)>0;
	}
	//交换a数组中,索引i和索引j处的值
	private static void exch(Comparable[] a,int i,int j){
		Comparable temp = a[i];
		a[i]=a[j];
		a[j] = temp;
	}
}

选择排序的时间复杂度分析

  • 选择排序使用了双层for循环,其中外层循环完成了数据交换,内层循环完成了数据比较,所以我们分别统计数据
    交换次数和数据比较次数

数据比较次数:
(N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)*(N-1)/2=N^2/2-N/2;
数据交换次数:
N-1
时间复杂度:N2/2-N/2+(N-1)=N2/2+N/2-1;
根据大O推导法则,保留最高阶项,去除常数因子,时间复杂度为O(N^2);

3.插入排序(Insertion sort)

插入排序是一种简单直观且稳定的排序算法。

  • 把所有的元素分为两组,已经排序的和未排序的;
  • 找到未排序的组中的第一个元素,向已经排序的组中进行插入;
  • 倒叙遍历已经排序的元素,依次和待插入的元素进行比较,直到找到一个元素小于等于待插入元素,那么就把待插入元素放到这个位置,其他的元素向后移动一位。
public class Insertion {
	public Insertion(){
	}
	//对数组内的元素进行排序
	public static void sort(Comparable[] a){
		for (int i=1;i<a.length;i++){
			for(int j=i;j>0;j--){ //从已排序的下一个元素开始向前遍历
				if(greater(a[j-1],a[j])){//遇到比它小的则交换
					exch(a,j-1,j);
				}else {   //因为前边都有序
					break;//如果没有则说明比前面都大跳出循环
				}
			}
			
		}
	}
	//判断v是否大于w
	private static boolean greater(Comparable v,Comparable w){
		return v.compareTo(w)>0;
	}
	//交换a数组中,索引i和索引j处的值
	private static void exch(Comparable[] a,int i,int j){
		Comparable temp=a[i];
		a[i]=a[j];
		a[j]=temp;
	}
}

插入排序的时间复杂度分析

插入排序使用了双层for循环,其中内层循环的循环体是真正完成排序的代码,所以,我们分析插入排序的时间复杂度,主要分析一下内层循环体的执行次数即可。
最坏情况,也就是待排序的数组元素为{12,10,6,5,4,3,2,1},那么:
比较的次数为:
(N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)(N-1)/2=N^2/2-N/2;
交换的次数为:
(N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)
(N-1)/2=N^2/2-N/2;
总执行次数为:
(N2/2-N/2)+(N2/2-N/2)=N^2-N;
按照大O推导法则,保留函数中的最高阶项那么最终插入排序的时间复杂度为O(N^2).

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值