几个简单排序

几个简单的排序

冒泡排序

这是一个简单但是经典的排序:

//冒泡排序,在第一次排序中就将最后一个最大的元素放在了最后一个位置
	public void sort(int[] a) {
		for(int  p=a.length-1;p>=0;p--) {
			//设定一个标志,如果在某一次内循环中已经就序,那么就不用再进行排序
			int flag = 0;
			for(int i =0;i<p;i++) {
				if(a[i]>a[i+1]) {
					int temp =a[i];
					a[i]=a[i+1];
					a[i+1]=temp;	
					flag=1;
				}				
			}
			if(flag==0) {
				break;
			}			
		}		
	}

插入排序

	public void sort (int[] a) {
		for(int p =1;p<a.length;p++) {
			//先选一个数
			int temp=a[p];
			int i;//定义这个数最后要放的位置
			//从这张牌的位置起,如果这个数比它前面一个小,就把前面这个值放在临时数的位置,不断循环,直到这个临时值
			//大于等于前面一个值,就插入i这个位置
			for(i =p;i>0&&a[i-1]>temp;i--) {
				a[i]=a[i-1];				
			}
			a[i]=temp;
		}
				
	}

希尔排序

public void sort (int[] a){
		//定义增量序列
		for(int D=a.length/2;D>0;D=D/2) {
			//进行插入排序
			for(int p=D;p<a.length;p++) {
				int temp = a[p];
				int i;
				for( i =p;i>0&&a[i-D]>temp;i--) {
					a[i]=a[i-D];
				}
				a[i]=temp;
			}			
		}	
	}

但是这个增量序列其实有点问题,因为序列之间有最大公约数不互质,在一些特殊情况下,仅仅在最后一趟序列为1时才起作用,这样它的时间复杂度其实和普通的插入排序一致都是n方,但是如果采用其他的一些增量序列在时间复杂度上会有比较好的表现,有兴趣的朋友可以自己尝试下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值