一、排序的分类及效率分析
二、三种基本排序(冒泡排序、选择排序、直接插入排序)的java代码实现
/*
三种基本排序:T(n) = O(n的平方),S(n) = O(1)
1、直接选择排序 不稳定的排序
2、冒泡排序 稳定的排序
3、直接插入排序 稳定的排序
*/
public class BasicSort {
public static void main(String[] args) {
int arr[] = {72,6,57,88,60,42,83,73,48,85};
//输出无序数组
System.out.println(Arrays.toString(arr));
//简单选择排序
selectSort(arr);
//冒泡排序
bubbleSort(arr);
//直接插入排序
insertionSort(arr);
//输出有序数组
System.out.println(Arrays.toString(arr));
}
/**
* 简单选择排序
* 基本思想:每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,避免频繁的交换,每次循环找出最小的索引后再交换
* 是不稳定的排序
*/
public static void selectSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int min = i;
//每一趟循环比较时,min用于存放较小元素的数组下标,这样当前批次比较完毕最终存放的就是此趟内最小的元素的下标,
// 避免每次遇到较小元素都要进行交换。
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[min]) {
min = j;
}
}
//进行交换,如果min发生变化,则进行交换
if (min != i) {
swap(arr,min,i);
}
}
}
/**
* 冒泡排序
* @param arr
*/
public static void bubbleSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
boolean flag = true;
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr,j,j+1);
flag = false;
}
}
if (flag) {
break;
}
}
}
/**
* 直接插入排序
* 基本思想:每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。
* @param arr
*/
public static void insertionSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int j = i;
while (j > 0 && arr[j] < arr[j - 1]) {
swap(arr,j,j-1);
j--;
}
}
}
/**
* 交换数组元素
* @param arr
* @param a
* @param b
*/
public static void swap(int []arr,int a,int b){
arr[a] = arr[a]+arr[b];
arr[b] = arr[a]-arr[b];
arr[a] = arr[a]-arr[b];
}
}