JAVA排序的方法

 import com.sun.org.apache.regexp.internal.recompile;

public class MySort {

 /**
  * 选择:最直接的排序算法,每次选一个最大或最小的元素放到应该的位置. 从无序数据中找出最小的一个跟第一个无序数据交换.
  */
 public static void select(int a[], int n) {
  for (int i = 0; i < n; i++) {
   int pos = i; // index of min element
   for (int j = i + 1; j < n; j++)
    if (a[j] < a[pos])
     pos = j;
   swap(a, i, pos);
  }
 }

 /**
  * 冒泡: 是一种多轮排序的方法,每轮都要比较相邻的数据对,按单一方向交换,直到所有数据都排好顺序为止.
  */
 public static void paoPao(int a[], int n) {
  boolean bSwapped;
  do {
   bSwapped = false;
   for (int i = 0; i < n - 1; i++) {
    if (a[i] > a[i + 1]) { // 由该条件确定是升序还是降序,此处为升序
     swap(a, i, i + 1); // 交换相邻的两个数据
     bSwapped = true;
    }
   }
  } while (bSwapped);

 }

 private static void swap(int[] a, int i, int j) {
  int temp = a[i];
  a[i] = a[j];
  a[j] = temp;

 }

 /**
  * 插入:先认为第一个元素是已经排好顺序的,然后依次把后面的元素"插入"到这个已经排好序的数列中正确的位置
  */
 public static void insert(int a[], int n) {
  for (int i = 1; i < n; i++) {
   int j, cur = a[i];
   for (j = i; j > 0 && a[j - 1] > cur; j--)
    a[j] = a[j - 1];
   a[j] = cur;
  }

 }

 /**
  * 快速:是比较排序中最快的算法.思想是由一个分界值把数组分成两部分,然后把大于等于分界值的数据集中
  * 到一边,把小于分界值的数据放到另外一边,然后不断对分开的部分再做同样的操作,直到排好顺序为止.
  */
 /**
  * j 初始
  */
 public static void quickSort(int[] data, int start, int end) {
  if ((end - start) == 1)
   return;
  if ((end - start) == 2) {

   if (data[start] < data[start + 1])
    return;
   else {
    swap(data, start, start + 1);
    return;
   }
  }
  int pivotIndex = (end + start) / 2;
  swap(data, pivotIndex, start);

  int mIndex = partition(data, start, end - 1, data[start]);

  swap(data, mIndex - 1, start);
  // 处理右半部分
  if ((end - mIndex) > 1) {

   quickSort(data, mIndex, end);
  }
  // 处理左半部分
  if ((mIndex - start) > 1) {

   quickSort(data, start, mIndex);
  }
 }

 private static int partition(int[] data, int l, int r, int pivot) {

  l++;
  while (l < r) {
   while (l < r && data[l] < pivot)
    l++;
   while (0 < r && data[r] >= pivot)
    r--;
   if (l < r) {

    swap(data, l, r);
   }
  }

  if (l == r) {

   return ++l;
  }
  return l;

 }

 public static void main(String[] args) {
  int n = 33;
  int a[] = new int[n];
  for (int i = 0; i < n; i++) {
   a[i] = (int) (Math.random() * 99);
  }
  for (int i = 0; i < n; i++) {
   System.out.print(a[i] + " ");
  }
  System.out.println();
  System.out.println("=================================");
  quickSort(a, 0, n);

  for (int i = 0; i < n; i++) {
   System.out.print(a[i] + " ");
  }
  System.out.println();
 }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值