package cn.ffr.sorting;
/**
* 整形排序算法
* @author User
*
*/
public class IntegerSorting {
private static int count = 0;
private IntegerSorting(){};
/**
* 插入排序,O(n^2)
* 将一个记录插入到已排好序的有续表中,从而得到一个新的、记录增一的有序表
* 输出结果:
[No.1]3 6 7 4 1 9 2 5 8 10
[No.2]3 6 7 4 1 9 2 5 8 10
[No.3]3 6 7 4 1 9 2 5 8 10
[No.4]3 4 6 7 1 9 2 5 8 10
[No.5]1 3 4 6 7 9 2 5 8 10
[No.6]1 3 4 6 7 9 2 5 8 10
[No.7]1 2 3 4 6 7 9 5 8 10
[No.8]1 2 3 4 5 6 7 9 8 10
[No.9]1 2 3 4 5 6 7 8 9 10
[No.10]1 2 3 4 5 6 7 8 9 10
*/
public static void insertSort(int[] array){
int temp;
for(int i = 1; i < array.length; i++){
print(array);
temp = array[i];
if(temp < array[i-1]){
int j = i - 1;
for(; j >= 0; j--){
if(array[j] > temp){
array[j+1] = array[j];//向后移动
}else{
array[j+1] = temp;
break;
}
}
if(j < 0){
array[j+1] = temp;//最小的,插入到最前面
}
}
}
}
/**
* 希尔排序
* 先将整个待排序的记录分割成若个子序列分别进行插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序
* 数据以增量的方式向前移动,提高插入排序的效率
* 输出结果:
[No.1]3 6 7 4 1 9 2 5 8 10
[No.2]3 6 7 4 1 9 2 5 8 10
[No.3]3 1 7 4 6 9 2 5 8 10
[No.4]3 1 7 4 6 9 2 5 8 10
[No.5]2 1 7 3 6 9 4 5 8 10
[No.6]2 1 7 3 5 9 4 6 8 10
[No.7]2 1 7 3 5 8 4 6 9 10
[No.8]2 1 7 3 5 8 4 6 9 10
[No.9]1 2 7 3 5 8 4 6 9 10
[No.10]1 2 7 3 5 8 4 6 9 10
[No.11]1 2 3 7 5 8 4 6 9 10
[No.12]1 2 3 5 7 8 4 6 9 10
[No.13]1 2 3 5 7 8 4 6 9 10
[No.14]1 2 3 4 5 7 8 6 9 10
[No.15]1 2 3 4 5 6 7 8 9 10
[No.16]1 2 3 4 5 6 7 8 9 10
[No.17]1 2 3 4 5 6 7 8 9 10
*/
public static void shellSort(int[] array){
int[] steps = {3, 1};
for(int step : steps){
_shellSort(array, step);//步长分别为3、1
}
}
/**
* 希尔排序的一次排序方法
* @param array
* @param step
*/
private static void _shellSort(int[] array, int step){
int temp;
for(int i = step; i < array.length; i++){
print(array);
temp = array[i];
if(temp < array[i-step]){
int j = i - step;
for(; j >= 0; j = j - step){
if(array[j] > temp){
array[j+step] = array[j];//向后移动
}else{
array[j+step] = temp;
break;
}
}
if(j < 0){
array[j+step] = temp;//最小的,插入到最前面
}
}
}
}
/**
* 冒泡排序,O(n^2)
* 一次排序后将最大的关键字沉入底部
[No.1]3 6 7 4 1 9 2 5 8 10
[No.2]3 6 4 1 7 2 5 8 9 10
[No.3]3 4 1 6 2 5 7 8 9 10
[No.4]3 1 4 2 5 6 7 8 9 10
[No.5]1 3 2 4 5 6 7 8 9 10
[No.6]1 2 3 4 5 6 7 8 9 10
[No.7]1 2 3 4 5 6 7 8 9 10
[No.8]1 2 3 4 5 6 7 8 9 10
[No.9]1 2 3 4 5 6 7 8 9 10
[No.10]1 2 3 4 5 6 7 8 9 10
*/
public static void bubbleSort(int[] array){
for(int i = 0; i < array.length - 1; i++){//最有一次比较没有意义,所以条件为:i<array.length-1
print(array);
for(int j = 0; j < array.length - i - 1; j++){
if(array[j] > array[j + 1]){
swap(array, j, j+1);
}
}
}
}
/**
* 快速排序,O(nlogn)
* 对冒泡排序的改进,先整体有序,在局部有序
* 输出结果:
[No.1]3 6 7 4 1 9 2 5 8 10
[No.2]2 1 3 4 7 9 6 5 8 10
[No.3]1 2 3 4 7 9 6 5 8 10
[No.4]1 2 3 4 7 9 6 5 8 10
[No.5]1 2 3 4 7 9 6 5 8 10
[No.6]1 2 3 4 7 9 6 5 8 10
[No.7]1 2 3 4 7 9 6 5 8 10
[No.8]1 2 3 4 5 6 7 9 8 10
[No.9]1 2 3 4 5 6 7 9 8 10
[No.10]1 2 3 4 5 6 7 9 8 10
[No.11]1 2 3 4 5 6 7 9 8 10
[No.12]1 2 3 4 5 6 7 8 9 10
[No.13]1 2 3 4 5 6 7 8 9 10
[No.14]1 2 3 4 5 6 7 8 9 10
*/
public static void quickSort(int[] array, int low, int high){
print(array);
if(low < high){
int mid = _quickSort(array, low, high);
quickSort(array, low, mid-1);
quickSort(array, mid+1, high);
}
}
/**
* 一次快速排序
*/
private static int _quickSort(int[] array, int low, int high){
int index = array[low];
while(low < high){
while(low < high && array[high] > index) high--;
array[low] = array[high];
while(low < high && array[low] < index) low++;
array[high] = array[low];
}
array[low] = array[high] = index;
return low;
}
/**
* 选择排序,采用关键字的比较,O(n^2)
* 在每趟n-i+1个记录中,选择最小的记录作为有序序列的第i个记录
* 输出结果:
[No.1]3 6 7 4 1 9 2 5 8 10
[No.2]1 6 7 4 3 9 2 5 8 10
[No.3]1 2 7 6 4 9 3 5 8 10
[No.4]1 2 3 7 6 9 4 5 8 10
[No.5]1 2 3 4 7 9 6 5 8 10
[No.6]1 2 3 4 5 9 7 6 8 10
[No.7]1 2 3 4 5 6 9 7 8 10
[No.8]1 2 3 4 5 6 7 9 8 10
[No.9]1 2 3 4 5 6 7 8 9 10
[No.10]1 2 3 4 5 6 7 8 9 10
*/
public static void selectSort(int[] array){
for(int i = 0; i < array.length - 1; i++){
print(array);
for(int j = i+1; j < array.length; j++){
if(array[j] < array[i]){
swap(array, i, j);
}
}
}
}
private static void print(int[] array){
count++;
System.out.print("[No."+count+"]");
for(int a :array){
System.out.print(a+" ");
}
System.out.println();
}
private static void swap(int[] array, int i, int j){
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
public static void main(String[] args) {
int[] array = {3, 6, 7 ,4, 1, 9, 2, 5, 8, 10};
// IntegerSorting.insertSort(array);
// IntegerSorting.shellSort(array);
// IntegerSorting.bubbleSort(array);
// IntegerSorting.quickSort(array, 0, array.length - 1);
IntegerSorting.selectSort(array);
print(array);
}
}