今天我们来探讨一下冒泡排序,选择排序,插入排序,希尔排序,归并排序,快速排序算法
下面是代码:
import java.util.Random;
public class Sort {
private static int a[];
private static int[] b;
public static void main(String[] args) {
Random r = new Random();
a = new int[100];
for(int i=1;i<=100;i++){
a[i-1] = r.nextInt(50000);
}
b = new int[a.length];
long x,y;
x = System.currentTimeMillis();
maoPaoSort();
y = System.currentTimeMillis();
System.out.println("冒泡排序:"+(y-x)+"ms");
x = System.currentTimeMillis();
chooseSort();
y = System.currentTimeMillis();
System.out.println("选择排序:"+(y-x)+"ms");
x = System.currentTimeMillis();
insertSort(0, 1);
y = System.currentTimeMillis();
System.out.println("插入排序:"+(y-x)+"ms");
x = System.currentTimeMillis();
guiBingSort(0, a.length - 1);
y = System.currentTimeMillis();
System.out.println("归并排序:"+(y-x)+"ms");
x = System.currentTimeMillis();
quickSort(0, a.length - 1);
y = System.currentTimeMillis();
System.out.println("快速排序:"+(y-x)+"ms");
x = System.currentTimeMillis();
shellSort();
y = System.currentTimeMillis();
System.out.println("希尔排序:"+(y-x)+"ms");
for (int m : a) {
System.out.print(m + " ");
}
}
/**
* 冒泡排序
*/
private static void maoPaoSort() {
int temp;
for (int i = 0; i < a.length - 1; i++) {
for (int j = 0; j < a.length - 1 - i; j++) {
if (a[j] > a[j + 1]) {
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
/**
* 选择排序
*/
private static void chooseSort() {
int temp;
for (int i = 0; i < a.length - 1; i++) {
int minInex = i;
for (int j = i + 1; j < a.length; j++) {
if (a[j] < a[minInex]) {
minInex = j;
}
}
if (minInex != i) {
temp = a[i];
a[i] = a[minInex];
a[minInex] = temp;
}
}
}
/**
* 插入排序
*/
private static void insertSort(int start, int k) {
for (int i = start + k; i < a.length; i = i + k) {
int insert = a[i];
int index = i;
for (int j = i - k; j >= 0; j = j - k) {
index = j;
if (a[j] > insert) {
a[j + k] = a[j];
} else {
break;
}
}
if (index + k != i) {
a[index + k] = insert;
}
}
}
/**
* 希尔排序 插入排序的加强,通过多次插入排序,达到消除更多的无序对,减小算法的时间复杂性
*/
private static void shellSort() {
int k = a.length;
while ((k = k / 2) >= 1) {
for (int i = 0; i < k; i++) {
insertSort(i, k);
}
}
}
/**
* 归并排序
*/
private static void guiBingSort(int left, int right) {
if (left >= right) {
return;
}
int mid = (left + right) / 2;
guiBingSort(left, mid);
guiBingSort(mid + 1, right);
mergeAndCopyBack(left, right, mid);
}
/**
* 合并两个有序序列的过程
*
* @param left
* @param right
* @param mid
*/
private static void mergeAndCopyBack(int left, int right, int mid) {
int indexLeft = left, indexRight = mid + 1;
int leftCopy = left;
for (; indexLeft <= mid && indexRight <= right;) {
if (a[indexLeft] < a[indexRight]) {
b[leftCopy++] = a[indexLeft++];
} else {
b[leftCopy++] = a[indexRight++];
}
}
if (indexLeft > mid) {
for (; indexRight <= right;) {
b[leftCopy++] = a[indexRight++];
}
} else {
for (; indexLeft <= mid;) {
b[leftCopy++] = a[indexLeft++];
}
}
// 合并后的序列保存在数字b中,需要拷贝会数字a中
for (int i = left; i <= right; i++) {
a[i] = b[i];
}
}
/**
* 快速排序
*/
private static void quickSort(int left, int right) {
if (left >= right) {
return;
}
int temp;
int mainElement = getMainElement(left, right);
int leftIndex = left, rightIndex = right - 1;
while (true) {
while (leftIndex <= right - 1 && a[leftIndex] < mainElement)
leftIndex++;
while (rightIndex >= left && a[rightIndex] >= mainElement)
rightIndex--;
if (leftIndex < rightIndex) {
temp = a[leftIndex];
a[leftIndex] = a[rightIndex];
a[rightIndex] = temp;
} else {
temp = a[leftIndex];
a[leftIndex] = a[right - 1];
a[right - 1] = temp;
break;
}
}
quickSort(left, leftIndex);
quickSort(leftIndex + 1, right);
}
/**
* 选主元
*
* @param left
* @param right
* @return
*/
private static int getMainElement(int left, int right) {
int temp, mainElement;
// 选取主元
int mid = (left + right) / 2;
// 将a[left],a[mid],a[left]三个数中最小的数字放在a[left]中,最大的数放在a[right]中
if (a[left] > a[mid]) {
temp = a[left];
a[left] = a[mid];
a[mid] = temp;
}
if (a[left] > a[right]) {
temp = a[left];
a[left] = a[right];
a[right] = temp;
}
if (a[mid] > a[right]) {
temp = a[mid];
a[mid] = a[right];
a[right] = temp;
}
mainElement = a[mid];
// 将a[mid]藏于a[right]前
if (mid != right - 1) {
temp = a[mid];
a[mid] = a[right - 1];
a[right - 1] = temp;
}
return mainElement;
}
}