比较Java中冒泡排序,选择排序,快速排序算法效率

讨论从小到大的情况,

冒泡排序算法,通过对数组元素两两比较,把小的往前排,一趟冒泡排序找到一个数组中最小的,虽然没一趟比较的次数会减小,但是如果排序的数组大小很大呢,显然这个算法的效率会变得很低。

算法代码:

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

选择排序算法:选择排序算法大概是这样的,定义一个变量存储每一次排序的值以及定义一个minIndex来存储最小值的下标,每一趟排序只交换一次,这样可以比冒泡排序更省时。

算法代码:

for(int i = 0;i<b.length;i++) {
        	int min = b[i];
            int minIndex = i;
        	for(int j = i+1;j<b.length;j++) {
        		if(b[j]<min) {
        			min = b[j];
        			minIndex = j;
        		}
        	}
        	temp = b[i];
        	b[i] = b[minIndex];
        	b[minIndex] = temp;
        }

快速排序:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

如果要实现代码在C,C++中要写很多,但是在Java中的util类库中有一个方法Arrays.sort()括号中将你需要排序的数组名放进去即可,这个方法可以默认的实现从小到大的排序。

那么我们怎么实现从大到小排序呢!

很简单,我们将数组的值逆序输出那么不就可以达到一个降序排序了?

但是循环避免交换过头了,只需要交换的次数为数组长度的一半。

代码:

Arrays.sort(c);
		/***********逆序Arrays.sort()方法********/
		for(int i = 0;i<c.length/2;i++) {
			temp = c[i];
			c[i] = c[c.length-i-1];    //就是将最后一个元素和第一个交换,倒数第二个和第二个交换
			c[c.length-i-1] = temp;
		}

算法代码:

Arrays.sort(c);

三种排序算法比较:

package shuzu;
/*
 * @ly
 * 比较冒泡排序,选择排序,快速排序的效率
 */
import java.util.*;


public class SpeedOfSortDemo {

	public static void main(String[] args) {
		final int N = 100000;
		int temp;
		long start = System.currentTimeMillis();
		int a[] = new int[N];   //冒泡排序
		int b[] = new int[N];   //选择排序
		int c[] = new int[N];   //快速排序
		/************冒泡排序***********/
		for(int i = 0;i<a.length;i++) {
			a[i] = (int)((Math.random())*50001);
			b[i] = a[i];
			c[i] = a[i];
		}
		
		for(int i = 0;i<a.length-1;i++) {
			for(int j = 0;j<a.length-1-i;j++) {
				if(a[j]>a[j+1]) {
					temp = a[j+1];
					a[j+1] = a[j];
					a[j] = temp;
				}
			}
		}
		long end = System.currentTimeMillis();
		System.out.println("冒泡排序所用时间:"+(end-start)+"ms");
        
		
		/************选择排序***************/
		long start1 = System.currentTimeMillis();
		for(int i = 0;i<b.length;i++) {
        	int min = b[i];
            int minIndex = i;
        	for(int j = i+1;j<b.length;j++) {
        		if(b[j]<min) {
        			min = b[j];
        			minIndex = j;
        		}
        	}
        	temp = b[i];
        	b[i] = b[minIndex];
        	b[minIndex] = temp;
        }
		long end1 = System.currentTimeMillis();
		System.out.println("选择排序用时:"+(end1-start1)+"ms");
		
		/************快速排序****************/
		long start2 = System.currentTimeMillis();
		Arrays.sort(c);
		long end2 = System.currentTimeMillis();
		System.out.println("Arrays.sort()用时:"+(end2-start2)+"ms");
	}

}

运行结果展示:


猜你喜欢

转载自blog.csdn.net/lytwy123/article/details/80996117