排序算法前言及选择排序

前言

排序就是将一组数据按照某种特定的逻辑进行重新的排列的过程。比如将一个数据按照由大到小的顺序排列。

我们接下来将说明一种初级的排序算法的实现,我们要从简单的排序算法慢慢的往下深入。在这里我们要通过它熟悉一些简单的技巧。

通用工具类

通用工具类如下:

public class SortUtil {

	public static boolean less(Comparable a , Comparable b){
		return a.compareTo(b) < 0;
	}
	
	public static void exch(Comparable[] a,int i,int j){
		Comparable t = a[i];
		a[i] = a[j];
		a[j] = t;
	}
	
	public static void show(Comparable[] a){
		int size = a.length;
		for (int i = 0; i < size; i++) {
			if (i == size -1) {
				System.out.print(a[i]);
				return;
			}
			System.out.print(a[i]+",");
		}
	}
	
}

辅助函数

sort():我们会把排序代码放到类的sort()方法中。
less():对元素进行比较,通过Comparable接口实现比较。
exch():将元素交换位置。

排序元素要实现Comparable接口

这样做 方便我们统一代码,使原有代码得到最大可能的复用。compareTo()必须实现一个完整的比较序列:

  • 自反性:对于所有的v有v=v;
  • 反对称性:对于所有的v<w都有w>v,且v=w时w=v;
  • 传递性,对于所有的v,w和x,如果v<=w且w<=x,则v<=x。

这些标准都很好理解,实现起来也不难。

运行时间

评判算法性能的重要依据,计算不同排序算法再同一组随机数据中的基本操作次数(包括比较和交换,或者数据的读写次数),因此上面一致的代码操作更能得出合理的结果。

我们需要计算比较和交换的次数,对于不交换元素的算法,我们会计算访问数组的次数

内存使用

也是衡量算法的一个标准,计算额外使用的空间。

选择排序

思想:首先,在数组中找到通过比较找到最小的那个元素,其次,将它和数组中的第一个元素交换位置。再次,在剩下的元素中找到最小的元素,将它与数组中的第二个元素交换位置。以此类推,直到整个数组排序完毕。这种方法就叫做选择排序,因为它不断的选择剩余元素的最小者,突出了一个选择,名字起的也是很贴切的。

因为每次交换都会排定一个元素,因此交换的次数是N,所以算法的时间效率取决于比较的次数。

算法实现

代码实现如下:

public class Selection {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Integer[] a = new Integer[]{1,4,6,2,0,3,2,7,8,1,9};
		sort(a);
		SortUtil.show(a);
	}

	
	public static void sort(Comparable[] a){
		int size = a.length;
		for (int i = 0; i < size; i++) {
			int min = i;
			for(int j = i+1;j < size;j++){
				if (SortUtil.less(a[j], a[min])) {
					min = j;
				}
			}
			SortUtil.exch(a, i, min);
		}
	}
}

运行后结果为:0,1,1,2,2,3,4,6,7,8,9
可以看到原始数据已经排序好了,实现起来不复杂。

通过上述算法实现我们可知:对于长度为N的数组,选择排序需要大约n2/2次比较和N次交换。由于是嵌套循环所以有(N-1)+(N-2)+…+2+1 = n(n-1)/2

我们可以看出选择排序有两个鲜明的特点:

  • 运行时间和输入无关。为了找出最小的元素而扫描一边数组不能为下一遍遍历提供任何有用信息。这种性质再某些情况下是缺点,因为一个已经有序的数组和一个随机排序的数据所用的排序时间竟然一样长。
  • 数据移动是最少的。每次交换都会确定一个最小值,因此仅用了N次交换,交换次数和数组的大小是线性关系的。
原创文章 63 获赞 59 访问量 4万+

猜你喜欢

转载自blog.csdn.net/u013049016/article/details/96322877
今日推荐