交换排序之冒泡排序(java实现)

无论哪种编程语言,在讲到数组和循环时,通常会介绍一种排序作为例子,就是冒泡排序,,,因为冒泡排序的算法基本组成部分就是数组和循环,并且排序算法的思路简单,容易理解。

冒泡排序是一种交换排序,其基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。

以下代码中的排序都按升序排列

根据上述的思想我们很自然的就能写出最基本的一段冒泡排序代码:

public class solution {
	 public static int[] maopao(int[] arr) {
		 int length=arr.length;
		 for(int i=0;i<length;i++) {
			 for(int j=i+1;j<length;j++) {
				 if(arr[i]>arr[j]) {
					 swap(arr,i,j);
				 }
		 }
	 }
		return arr; 
   }
	 public static void swap(int arr[],int i,int j) {
		int temp=arr[i];
		arr[i]=arr[j];
		arr[j]=temp;
	 }
	 public static void main(String args[]) {
		 int[] a={3,2,4,1,5,6,7,9,8};
		 System.out.println(Arrays.toString(maopao(a)));
	 }
}

这段代码看上去简单易懂,应该为最容易写出的排序代码,,,但是,这个代码还有改进的空间么?答案是肯定的!

通过上述代码,我们很容易发现,其在排好某一个关键字后,其对之后其余的关键字的排序没有什么帮助,甚至有可能将其余关键字中小的值交换到了末尾,,,也就是,上述的算法效率是较低的。。。

我们对上述代码做如下改变:

public class Newsolution {
	public static int[] bettermaopao(int[] arr) {
		int length=arr.length;
		for(int i=0;i<length;i++) {
			for(int j=length-2;j>=i;j--) {
				if(arr[j+1]<arr[j]) {
					swap(arr,j,j+1);
				}
			}
		}
		return arr;
	}
	public static void swap(int arr[],int p,int q) {
		int temp=arr[q];
		arr[q]=arr[p];
		arr[p]=temp;
	}
	public static void main(String args[]) {
		int[] a= {3,2,4,1,5,6,7,9,8};
		System.out.println(Arrays.toString(bettermaopao(a)));
	}
}

上述算法“较好地”解决“上上述”算法中的缺点,上述算法从记录序列的末尾开始,比较相邻两个数的大小,然后交换,将较小的数慢慢的“浮上去”,效率大大提过。。。

但上述算法还有一个缺点,,,就是当假如待排序记录除了前几个记录外,后面的记录都是有序的,这时如果继续使用上述算法的话,会发现,在将前面几个无序的记录排好序,之后已经有序的记录还是会继续按照上述算法执行下去,这会造成不必要的时间耗损,,,这时的解决办法是加入一个标记变量,,,具体的代码实现较为简单,编者就不在这写了。。。(对的,,,我就是懒~~逃~~~)

考虑最坏情况,也就是记录逆序的情况,冒泡排序时间复杂度为:O(2*(1+2+3+……+(n-1)))=O(n^2)

猜你喜欢

转载自blog.csdn.net/bai_and_hao_1314/article/details/80171576