本文仅实现了冒泡排序、选择排序,插入排序和快速排序,仅供参考学习。
性能体验:冒泡—>选择—>插入—>快排。
冒泡排序:
/**
* 冒泡排序—最简单的排序
* 稳定性:稳定
* 时间复杂度:O(n^2)
*/
public void BubbleSort(int a[]) {
// 用于交换两个数的值
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 + 1];
a[j + 1] = a[j];
a[j] = temp;
}
}
// 大的数向后移动
}
// 结束
}
选择排序:
/**
* 升序
* 选择排序—找出最小数,然后交换当前最小数
* 稳定性:不稳定
* 时间复杂度:O(n^2)
*/
public void SelectSort(int[] a) {
int temp = 0;
int min;
int index;
for (int i = 0; i < a.length - 1; i++) {
min = a[i];
index = i;
for (int j = i + 1; j < a.length; j++) {
if (a[j] < min) {
// 记录最小元素的位置
index = j;
// 更新最小值
min = a[j];
}
}
if (i != index) {
// 找到最小值,交换位置
temp = a[index];
a[index] = a[i];
a[i] = temp;
}
}
}
插入排序
/** * 升序 * 直接插入排序 * 稳定性:稳定 * 时间复杂度:O(n^2) */ public void InsertSort(int[] a) { int insertVal; int index; for (int i = 1; i < a.length; i++) { insertVal = a[i]; index = i - 1; while (index >= 0 && insertVal < a[index]) { a[index + 1] = a[index]; index--; } a[index + 1] = insertVal; } }
/** * 快速排序 * 稳定性:不稳定,多个相同的值的相对位置(前后位置)也许会在算法结束时产生变动 * 时间复杂度:O(nlogn) * 空间复杂度:O(nlogn) */ public void quicksort(int[] a, int left, int right) { int dp; if (left < right) { dp = partition(a, left, right); quicksort(a, left, dp - 1); quicksort(a, dp + 1, right); } } /** * @return 返回中轴位置 */ public int partition(int[] a, int left, int right) { int pivot = a[left]; while (left < right) { while (left < right && a[right] >= pivot) right--; if (left < right) a[left++] = a[right]; while (left < right && a[left] <= pivot) left++; if (left < right) a[right--] = a[left]; } a[left] = pivot; return left; }
测试程序入口
public static void main(String[] args) { // TODO Auto-generated method stub SortMain s = new SortMain(); int size = 40000000; // 数组必须马上分配空间,否则编译器报错 int[] a = new int[size]; for (int i = 0; i < a.length; i++) { // 取0~100随机数 int r = (int) (Math.random() * 10000); a[i] = r; // System.out.print(r + " "); } System.out.println(); //开始时间 Calendar car = Calendar.getInstance(); System.out.println(car.getTime()); // 冒泡 // s.BubbleSort(a); // 选择 // s.SelectSort(a); // // 插入 // s.InsertSort(a); //快排 s.quicksort(a,0, size-1); //排序结束时间 car = Calendar.getInstance(); System.out.println(car.getTime()); //数组长度较小时打印数组,较大时注释掉避免死机 // for (int i = 0; i < a.length; i++) { // System.out.print(a[i] + " "); // } }
各排序算法小结