内部排序
以下分别为冒泡排序,简单选择排序,直接插入排序,希尔排序,快速排序,堆排序的java实现。
import java.util.Arrays;
import java.util.Random;
public class Sort {
/**
* 冒泡排序
* @param arr
*/
public static void bubbleSort(int[] arr){
int temp = 0;
boolean flag = true;
// 最外层为排序趟数,若无交换,则flag = fasle,退出循环
for(int i = 0; i < arr.length - 1 && flag; i++){
flag = false;
for(int j = 0; j < arr.length - i - 1; j++){
if(arr[j] > arr[j + 1]){
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = true;
}
}
}
}
/**
* 简单选择排序
* @param arr
*/
public static void selectSort(int[] arr){
int temp = 0;
for(int i = 0; i < arr.length - 1; i++){
int min = arr[i];
int minIndex = i;
for(int j = i + 1; j < arr.length; j++){
if(min > arr[j]){
minIndex = j;
min = arr[j];
}
}
if(minIndex != i){
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
}
/**
* 直接插入排序
* @param arr
*/
public static void insertSort(int[] arr){
for(int i = 1; i < arr.length; i++){
int index = i - 1;
int insertValue = arr[i];
while(index >= 0 && insertValue < arr[index]){
arr[index + 1] = arr[index];
index--;
}
arr[index + 1] = insertValue;
}
}
/**
* 希尔排序
* @param arr
*/
public static void shellSort(int[] arr){
int increment = arr.length;
do{
increment = increment / 3 + 1;
for(int i = increment; i < arr.length; i++){
int index = i - increment;
int insertValue = arr[i];
while(index >= 0 && insertValue < arr[index]){
arr[index + increment] = arr[index];
index -= increment;
}
arr[index + increment] = insertValue;
}
}while(increment > 1);
}
private static void quick(int[] arr, int left, int right){
int l = left;
int r = right;
int pivot = arr[(left + right) / 2];
int temp = 0;
while(l < r){
while(arr[l] < pivot) l++;
while(arr[r] > pivot) r--;
if(l >= r){
break;
}
temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
if(arr[l] == pivot){
r--;
}else if(arr[r] == pivot){
l++;
}else{
l++;
r--;
}
}
if(l == r){
l++;
r--;
}
if(l < right) quick(arr, l ,right);
if(left < r) quick(arr, left, r);
}
/**
* 快速排序
* @param arr
*/
public static void quickSort(int[] arr){
quick(arr, 0, arr.length - 1);
}
/**
* 堆调整, 将标号index后的序列调整为堆
* @param arr
* @param index
* @param m
*/
private static void heapAdjust(int[] arr, int index, int m){
int temp = arr[index];
for(int i = 2 * index + 1; i <= m; i = 2 * i + 1){
if(i < m && arr[i] < arr[i + 1]){
i++;
}
if(temp > arr[i]){
break;
}
arr[index] = arr[i];
index = i;
}
arr[index] = temp;
}
/**
* 堆排序
* @param arr
*/
public static void heapSort(int[] arr){
for(int i = arr.length / 2 - 1; i >= 0; i--){
heapAdjust(arr, i, arr.length - 1);
}
int temp = 0;
for(int i = arr.length - 1; i > 0; i--){
temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
heapAdjust(arr, 0, i - 1);
}
}
public static void main(String[] args) {
Random random = new Random();
int[] arr = new int[10];
for(int i = 0; i < arr.length; i++){
arr[i] = random.nextInt(100);
}
//bubbleSort(arr);
//selectSort(arr);
//insertSort(arr);
//shellSort(arr);
//quickSort(arr);
heapSort(arr);
System.out.println(Arrays.toString(arr));
}
}