A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡晓思 中级黑马   /  2013-7-9 22:11  /  1287 人查看  /  1 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文





几种排序算法

  1. package hays.algoriths;

  2. /**
  3. * 这是一个基于各种排序算法的类,是algorithms包下的第一个类,由hays整理编写,全部是静态的排序方法.
  4. *
  5. * @author hays H
  6. * @version 1.0
  7. */
  8. public class Sort {

  9.         /**
  10.          * 利用插入排序给数组排序的算法,没有返回值,当执行完方法后,输入数组就a就已经包含了已经排好序的输出序列
  11.          *
  12.          * @param a
  13.          *            接收一个 int 型的数组
  14.          */
  15.         public static void insertionSort(int[] a) {
  16.                 int key, i;
  17.                 for (int j = 1; j < a.length; j++) {
  18.                         key = a[j];
  19.                         i = j - 1;
  20.                         while (i >= 0 && a[i] > key) {
  21.                                 a[i + 1] = a[i];
  22.                                 i = i - 1;
  23.                         }
  24.                         a[i + 1] = key;
  25.                 }
  26.         }

  27.         /**
  28.          * 对int型数组进行排序的方法,利用合并排序算法,利用分治法的思想,不断合并递归
  29.          *
  30.          * @param arr
  31.          *            接收一个int型的数组
  32.          * @param p
  33.          *            需要排序的起始元素
  34.          * @param r
  35.          *            待排序的 终止元素
  36.          */
  37.         public static void mergeSort(int[] arr, int p, int r) {
  38.                 int q;
  39.                 if (p < r) {
  40.                         q = (p + r) / 2;
  41.                         mergeSort(arr, p, q);
  42.                         mergeSort(arr, q + 1, r);
  43.                         merge(arr, p, q, r);
  44.                 }
  45.         }

  46.         // 分治法排序
  47.         private static void merge(int[] arr, int p, int q, int r) {
  48.                 int n1 = q - p + 1;
  49.                 int n2 = r - q;
  50.                 int[] L = new int[n1 + 1];
  51.                 int[] R = new int[n2 + 1];
  52.                 for (int i = 0; i < n1; i++) {
  53.                         L[i] = arr[p + i];
  54.                 }
  55.                 for (int j = 0; j < n2; j++) {
  56.                         R[j] = arr[q + j + 1];
  57.                 }
  58.                 L[n1] = Integer.MAX_VALUE;
  59.                 R[n2] = Integer.MAX_VALUE;
  60.                 int i = 0;
  61.                 int j = 0;
  62.                 for (int k = p; k < r + 1; k++) {
  63.                         if (L[i] <= R[j]) {
  64.                                 arr[k] = L[i];
  65.                                 i++;
  66.                         } else {
  67.                                 arr[k] = R[j];
  68.                                 j++;
  69.                         }
  70.                 }
  71.         }

  72.         /**
  73.          * 冒泡排序,对一个整型数组进行排序
  74.          *
  75.          * @param arr
  76.          *            接收一个整型数组
  77.          */
  78.         public static void bubbleSort(int[] arr) {
  79.                 for(int i=0;i<arr.length;i++){
  80.                         for(int j=arr.length-1;j>i;j--){
  81.                                 if(arr[j]<arr[j-1])
  82.                                 {
  83.                                         int temp;
  84.                                         temp = arr[j-1];
  85.                                         arr[j-1]=arr[j];
  86.                                         arr[j]=temp;
  87.                                 }
  88.                         }
  89.                 }
  90.         }
  91.        
  92.         /**
  93.          * 堆排序:对一个整型数组进行排序 堆排序的运行时间为O(nlgn).它是一种原地(in place)排序算法,在任何时候只有常数个元素存储在数组之外
  94.          * 堆排序引入 堆数据结构  管理算法执行中的信息
  95.          *           堆数据结构不只是在堆排序中有用,还可以构成一个有效的优先队列.
  96.          * @param arr 接收一个整型数组
  97.          *
  98.          */
  99.         private static int heap_size;
  100.         public static void heapSort(int[] arr){
  101.                
  102.                 build_MAX_heap(arr);
  103.                 for (int i = arr.length; i>=2; i--) {
  104.                         int temp = arr[0];
  105.                         arr[0] = arr[i-1];
  106.                         arr[i-1] = temp;
  107.                         heap_size = heap_size -1;
  108.                         MAX_heapify(arr, 1);
  109.                 }
  110.         }

  111.         private static void build_MAX_heap(int[] arr) {
  112.                 heap_size = arr.length;
  113.                 for (int i = arr.length/2; i>=1; i--) {
  114.                         MAX_heapify(arr,i);
  115.                 }
  116.         }

  117.         private static void MAX_heapify(int[] arr, int i) {
  118.                 int largest;
  119.                 int l = 2*i;    //lift(i)
  120.                 int r = 2*i +1; //right(i)
  121.                 if(l<=heap_size && arr[l-1]>arr[i-1]){
  122.                         largest = l;
  123.                 }
  124.                 else{
  125.                         largest = i;
  126.                 }
  127.                 if(r<=heap_size && arr[r-1]>arr[largest-1]){
  128.                         largest = r;
  129.                 }
  130.                 if(largest!=i){
  131.                         int temp = arr[i-1];
  132.                         arr[i-1] = arr[largest-1];
  133.                         arr[largest-1] = temp;
  134. MAX_heapify(arr, largest);
  135.                 }       
  136.         }
  137.        
  138. }
复制代码



1 个回复

倒序浏览
值得学习ing!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马