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();
}
}