排序问题(一)

原文地址:http://www.javawxs.com/index.php/sort-1/


在java学习或是数据结构的学习中,排序都是比较重要的一个部分,对于各种排序算法可能会有些头疼;这篇文章将详细讲解一下排序问题;为简单起见,例子中的数组只包含整数而且元素个数比较少(百万以内)。被排序的对象应属于Comparable类型,因此我们使用CompareTo方法对数据进行相容的排序。这种叫做基于比较的排序。默认排序没有或不可接受的时候,需要重写Comparable来实现排序算法。

插入排序

插入排序是最简单的排序算法;它由N-1趟排序组成。对于p-1到N-1趟,插入排序保证从位置0到位置p的元素已经完成排序。在第p趟,将位置p的元素向左移动,直到它在前p+1个元素中的正确位置被找到的地方。

位置p上的元素储存于tmp,而(在位置p之前)所有更大的元素都被向右移动一个位置,然后tmp被置于正确的位置上;以下为代码:

  1. package com.javawxs;
  2. public class InsertionSort {
  3. public static void main(String[] args) {
  4. Integer[] arr = { 71, 45, 32, 76, 142, 43, 98, 54, 14, 333, 12, 31, 3 };
  5. insertionSort(arr);
  6. for (int i =0; i < arr.length; i++)
  7. System.out.print(arr[i] + “ ”);
  8. }
  9. public static <T extends Comparable<? super T>> void insertionSort(T[] a) {
  10. int j;
  11. for (int p = 1; p < a.length; p++) {
  12. T tmp = a[p];
  13. for (j = p; j > 0 && tmp.compareTo(a[j -1]) <0; j–)
  14. a[j] = a[j - 1];
  15. a[j] = tmp;
  16. }
  17. }
  18. }

希尔排序

希尔排序(Shellsort)的名字源于的它的发明者Donald Shell,它通过比较相距一定间隔的元素来实现;各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟为止;所以希尔排序也叫缩减增量排序

希尔排序使用一个序列h1,h2,h3……,ht,叫做增量序列,只要h1=1,那么任何增量序列都是可行的。在使用hk的一趟排序之后,对于每个i,都有a[i]<=a[i+hk];所有间隔hk的元素都被排序。

希尔排序的一个重要性质:一个hk排序的文件保持它的hk排序性;实际上,假如不这样的话,那么希尔排序也就没什么意义了,因为前面各趟排序会被后面的各趟排序打乱。

hk排序的一般做法是,对于hk,hk+1,……,N-1中的每一个位置i,把其上的元素放到i,i-hk,i-2hk,……中的正确位置上。虽然不影响最终结果,但是通过观察可以发现一趟hk的排序作用就是对hk个独立的子数组执行一次插入排序。

以下为代码:

  1. package com.javawxs;
  2. public class ShellSort {
  3. public static void main(String[] args) {
  4. Integer[] arr = { 71, 45, 32, 76, 142, 43, 98, 54, 14, 333, 12, 31, 3 };
  5. shellSort(arr);
  6. for (int i =0; i < arr.length; i++)
  7. System.out.print(arr[i] + “ ”);
  8. }
  9. public static <T extends Comparable<? super T>> void shellSort(T[] a) {
  10. int j;
  11. for (int gap = a.length /2; gap >0; gap /=2)
  12. for (int i = gap; i < a.length; i++) {
  13. T tmp = a[i];
  14. for (j = i; j >= gap && tmp.compareTo(a[j - gap]) <0; j -= gap)
  15. a[j] = a[j - gap];
  16. a[j] = tmp;
  17. }
  18. }
  19. }   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值