交换排序之--冒泡排序,快速排序


    冒泡排序是一种很经典的排序方式了,当然他也是最简单的一种交换式排序,冒泡排序的思想很简单,从前面开始,每每两个数相比,如果前面的大于后面的则交换位置,知道最后一个数,这样一轮排序下来,最大的数就跑到了最后面,如此往复,知道全部有序。


   当然上面是最简单的冒泡排序,他显然有一个很大的缺点,就是做了很多的重复劳动,当我们开始排序的时候,实际上整个数列就可以分成有序区和无序区,而根据冒泡排序的特性,有序区里面已经排好序的数是不用的动的,而根据上面的那种算法,每次一轮排序的时候都是遍历整个数列,包括有序区,这就十分浪费时间了。所以优化的方式时,每次一轮排序完,都标记一下这个数的位置,即设定一个有序区的标志位,这样下次排序的时候只需要遍历无序区里面的数了。


   下面是具体的代码:

   

//冒泡排序
	public static int[] BubbleSort(int r[],int n){
		int exchang=n;//有序区标记位,一开始默认是标记在最后一位
		while (exchang!=0) {//还未全部有序时
			int bound=exchang;//将标记位赋给bound
			exchang=0;
			//一轮冒泡排序
			for (int i = 0; i <bound; i++) {//遍历无序区
				if (r[i]>r[i+1]) {//如果前面比后面打,则交换
					int buffer=r[i];
					r[i]=r[i+1];
					r[i+1]=buffer;
					
					exchang=i;//更新有序区标记位
				}
				
			}
			
		}
		
		return r;
	}

  冒泡排序是一种稳定的排序方式,他的时间复杂度为O(n²)。


同样属于交换排序的快速排序是对冒泡排序的一种改进,冒泡排序每次比较都说是相邻两个数,也就意味着每一次交换都只移动了一个位置,这就造成了总的比较次数和移动次数比较多,而快速排序则改进了这一缺点,挑一个数为轴,每次挑和他距离最远的数与他相比,然后交换,这样小的可以快速被交换到左边,大的快速被交换到右边,大大减少了比较次数和移动交换次数。


快速排序的思想是:选择最左边的数为轴,先选择最右边的数与他比较,如果他大于最右边的数,则交换位置,此时最左边的数被交换到最右边,然后他再找离他最远的数比较,如果比他大,则交换位置,这样一轮快速排序下来,比这个轴值大的都跑到他右边去了,比这个轴值小的都跑到他左边去了,然后再分别递归他左边和右边进行快速排序,直到整个数列有序。


快速排序是种不稳定的排序。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值