排序算法--交换篇(冒泡,快排)

1.冒泡排序

算法思想:反复扫描待排序记录序列,在扫描的过程中顺次比较相邻的两个元素的大小,若逆序就交换位置。第一趟排序不断地将相邻两个记录中关键字大的记录向后移动,第二趟将前n-1个记录进行同样的操作,结果次大的记录被放在n-1个记录的位置。如此反复,每趟排序都将一个记录排序到位,直到剩下一个最小的记录。

	private static void BubbleSort(int[] a) {
		int temp=0;
		for (int i = 0; i < a.length-1; i++) {
			for (int j = 0; j < a.length-i-1; j++) {
				if(a[j]>a[j+1]){
					temp=a[j];
					a[j]=a[j+1];
					a[j+1]=temp;
				}
				
			}
			
		}
		
	}

算法分析:例如数组[48,62,35,77,55,14,35,98,22,40],第一趟后[48,35,62,55,14,35,77,22,40,98],第二趟后[35,48,55,14,35,62,22,40,77,98],第三躺[35,48,14,35,55,22,40,62,77,98],第四趟[35,14,35,48,22,40,55,62,77,98],第五趟[14,35,35,22,40,48,55,62,77,98],第六趟[14,35,,22,35,40,48,55,62,77,98],最后[14,22,35,35,40,48,55,62,77,98]

时间复杂度O(n^2)    空间复杂度O(1)    稳定

2.快速排序

算法思想:从待排序记录序列中选取一个记录(通常取第一个)为枢轴,其关键字K1,然后将其余关键字小于k1的记录移到前面,大于的数字放在后面,结果将待排序记录序列分为两个子表,最后将关键字为K1的记录插到其分界线的位置。

	private static void QKSort(int[] a,int low,int high) {
		int pos;
		if(low<high){
			pos=QKPass(a,low,high);
			QKSort(a,low,pos-1);
			QKSort(a,pos+1,high);
		}
	}
	//一趟快速排序
	private static int QKPass(int[] a, int low, int high) {
		int x=a[low];//选择基准位置
		while(low<high){
			while(low<high&&a[high]>x)
				high--;//high从右到左找小于x的记录
			if(low<high){//找到小于x的记录,则送入空单元a[low]
				a[low]=a[high];
				low++;
			}
			while(low<high&&a[low]<x)//low从左到右找大于x的记录
				low++;
			if(low<high){//找到大于x的记录,则送入空单元a[high]
				a[high]=a[low];
				high--;
			}
		}
		a[low]=x;//将基准记录保存到low=high的位置
		
		return low;//返回基准记录的位置
	}

算法分析:例如序列{48,62,35,77,55,14,35,98}

一次划分后:{35,14,35}48{55,77,62,98}分别进行快速排序

第二次划分:{14} 35 {35} 48  55{62}77{98}

快速排序递归算法的执行过程对应一棵二叉树,理想情况下是一棵完全二叉树,递归工作栈的大小与上述递归调用二叉树的深度对应,平均情况下辅助空间复杂度为O(log2n)      时间复杂度O(nlog2n)      不稳定

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值