本文主要介绍十大内部排序算法(源码)
一、折半插入排序
public class BinaryInsertSort {
public static void binaryInsertSort ( int [ ] data) {
System. out. println ( "开始排序" ) ;
int arrayLength = data. length;
for ( int i = 1 ; i < arrayLength; i++ ) {
int temp = data[ i] ;
int low = 0 ;
int high = i - 1 ;
while ( low <= high) {
int mid = ( low + high) / 2 ;
if ( temp > data[ mid] ) {
low = mid + 1 ;
} else {
high = mid - 1 ;
}
}
for ( int j = i; j > low; j-- ) {
data[ j] = data[ j - 1 ] ;
}
data[ low] = temp;
System. out. println ( java. util. Arrays. toString ( data) ) ;
}
}
public static void main ( String[ ] args) {
int [ ] data = { 9 , - 16 , 21 , 23 , - 30 , - 49 , 21 , 30 , 30 } ;
System. out. println ( "排序之前:\n" + java. util. Arrays. toString ( data) ) ;
binaryInsertSort ( data) ;
System. out. println ( "排序之后:\n" + java. util. Arrays. toString ( data) ) ;
}
}
二、直接插入排序
public class InsertSort {
public static void insertSort ( int [ ] data) {
System. out. println ( "开始排序" ) ;
int arrayLength = data. length;
for ( int i = 1 ; i < arrayLength; i++ ) {
int temp = data[ i] ;
if ( data[ i] - data[ i - 1 ] < 0 ) {
int j = i - 1 ;
for ( ; j >= 0 && data[ j] - temp > 0 ; j-- ) {
data[ j + 1 ] = data[ j] ;
}
data[ j + 1 ] = temp;
}
System. out. println ( java. util. Arrays. toString ( data) ) ;
}
}
public static void main ( String[ ] args) {
int [ ] data = { 9 , - 16 , 21 , 23 , - 30 , - 49 , 21 , 30 , 30 } ;
System. out. println ( "排序之前:\n" + java. util. Arrays. toString ( data) ) ;
insertSort ( data) ;
System. out. println ( "排序之后:\n" + java. util. Arrays. toString ( data) ) ;
}
}
三、归并排序
public class MergeSort {
public static void mergeSort ( int [ ] data) {
sort ( data, 0 , data. length - 1 ) ;
}
private static void sort ( int [ ] data, int left, int right) {
if ( left < right) {
int center = ( left + right) / 2 ;
sort ( data, left, center) ;
sort ( data, center+ 1 , right) ;
merge ( data, left, center, right) ;
}
}
private static void merge ( int [ ] data, int left, int center, int right) {
int [ ] tempArr = new int [ data. length] ;
int mid = center + 1 ;
int third = left;
int temp = left;
while ( left <= center && mid <= right) {
if ( data[ left] - data[ mid] <= 0 ) {
tempArr[ third++ ] = data[ left++ ] ;
} else {
tempArr[ third++ ] = data[ mid++ ] ;
}
}
while ( mid <= right) {
tempArr[ third++ ] = data[ mid++ ] ;
}
while ( left <= center) {
tempArr[ third++ ] = data[ left++ ] ;
}
while ( temp <= right) {
data[ temp] = tempArr[ temp++ ] ;
}
}
public static void main ( String[ ] args) {
int [ ] data = { 9 , - 16 , 21 , 23 , - 30 , - 49 , 21 , 30 , 30 } ;
System. out. println ( "排序之前:\n" + java. util. Arrays. toString ( data) ) ;
mergeSort ( data) ;
System. out. println ( "排序之后:\n" + java. util. Arrays. toString ( data) ) ;
}
}
四、基数排序
import java. util. Arrays;
public class MultiKeyRadixSort {
public static void radixSort ( int [ ] data, int radix, int d) {
System. out. println ( "开始排序:" ) ;
int arrayLength = data. length;
int [ ] temp = new int [ arrayLength] ;
int [ ] buckets = new int [ radix] ;
for ( int i = 0 , rate = 1 ; i < d; i++ ) {
Arrays. fill ( buckets, 0 ) ;
System. arraycopy ( data, 0 , temp, 0 , arrayLength) ;
for ( int j = 0 ; j < arrayLength; j++ ) {
int subKey = ( temp[ j] / rate) % radix;
buckets[ subKey] ++ ;
}
for ( int j = 1 ; j < radix; j++ ) {
buckets[ j] = buckets[ j] + buckets[ j - 1 ] ;
}
for ( int m = arrayLength - 1 ; m >= 0 ; m-- ) {
int subKey = ( temp[ m] / rate) % radix;
data[ -- buckets[ subKey] ] = temp[ m] ;
}
System. out. println ( "对" + rate + "位上子关键字排序:"
+ java. util. Arrays. toString ( data) ) ;
rate *= radix;
}
}
public static void main ( String[ ] args) {
int [ ] data = { 1100 , 192 , 221 , 12 , 13 } ;
System. out. println ( "排序之前:\n" + java. util. Arrays. toString ( data) ) ;
radixSort ( data, 10 , 4 ) ;
System. out. println ( "排序之后:\n" + java. util. Arrays. toString ( data) ) ;
}
}
五、快速排序
public class QuickSort {
private static void swap ( int [ ] data, int i, int j) {
int temp = data[ i] ;
data[ i] = data[ j] ;
data[ j] = temp;
}
private static void subSort ( int [ ] data, int start, int end) {
if ( start < end) {
int base = data[ start] ;
int low = start;
int high = end + 1 ;
while ( true ) {
while ( low < end && data[ ++ low] - base <= 0 )
;
while ( high > start && data[ -- high] - base >= 0 )
;
if ( low < high) {
swap ( data, low, high) ;
} else {
break ;
}
}
swap ( data, start, high) ;
subSort ( data, start, high - 1 ) ;
subSort ( data, high + 1 , end) ;
}
}
public static void quickSort ( int [ ] data) {
subSort ( data, 0 , data. length- 1 ) ;
}
public static void main ( String[ ] args) {
int [ ] data = { 9 , - 16 , 30 , 23 , - 30 , - 49 , 25 , 21 , 30 } ;
System. out. println ( "排序之前:\n" + java. util. Arrays. toString ( data) ) ;
quickSort ( data) ;
System. out. println ( "排序之后:\n" + java. util. Arrays. toString ( data) ) ;
}
}
六、直接选择排序
public class SelectSort {
public static void selectSort ( int [ ] data) {
System. out. println ( "开始排序" ) ;
int arrayLength = data. length;
for ( int i = 0 ; i < arrayLength - 1 ; i++ ) {
for ( int j = i + 1 ; j < arrayLength; j++ ) {
if ( data[ i] - data[ j] > 0 ) {
int temp = data[ i] ;
data[ i] = data[ j] ;
data[ j] = temp;
}
}
System. out. println ( java. util. Arrays. toString ( data) ) ;
}
}
public static void main ( String[ ] args) {
int [ ] data = { 9 , - 16 , 21 , 23 , - 30 , - 49 , 21 , 30 , 30 } ;
System. out. println ( "排序之前:\n" + java. util. Arrays. toString ( data) ) ;
selectSort ( data) ;
System. out. println ( "排序之后:\n" + java. util. Arrays. toString ( data) ) ;
}
}
七、直接选择排序-改进
public class SelectSort2 {
public static void selectSort ( int [ ] data) {
System. out. println ( "开始排序" ) ;
int arrayLength = data. length;
for ( int i = 0 ; i < arrayLength - 1 ; i++ ) {
int minIndex = i;
for ( int j = i + 1 ; j < arrayLength; j++ ) {
if ( data[ minIndex] - data[ j] > 0 ) {
minIndex = j;
}
}
if ( minIndex != i) {
int temp = data[ i] ;
data[ i] = data[ minIndex] ;
data[ minIndex] = temp;
}
System. out. println ( java. util. Arrays. toString ( data) ) ;
}
}
public static void main ( String[ ] args) {
int [ ] data = { 9 , - 16 , 21 , 23 , - 30 , - 49 , 21 , 30 , 30 } ;
System. out. println ( "排序之前:\n" + java. util. Arrays. toString ( data) ) ;
selectSort ( data) ;
System. out. println ( "排序之后:\n" + java. util. Arrays. toString ( data) ) ;
}
}
八、Shell排序
public class ShellSort {
public static void ShellSort ( int [ ] data) {
System. out. println ( "开始排序" ) ;
int arrayLength = data. length;
int h = 1 ;
while ( h <= arrayLength / 3 ) {
h = h * 3 + 1 ;
}
while ( h > 0 ) {
System. out. println ( "===h的值:" + h + "===" ) ;
for ( int i = h; i < arrayLength; i++ ) {
int temp = data[ i] ;
if ( data[ i] - data[ i - h] < 0 ) {
int j = i - h;
for ( ; j >= 0 && data[ j] - temp > 0 ; j -= h) {
data[ j + h] = data[ j] ;
}
data[ j + h] = temp;
}
System. out. println ( java. util. Arrays. toString ( data) ) ;
}
h = ( h - 1 ) / 3 ;
}
}
public static void main ( String[ ] args) {
int [ ] data = { 9 , - 16 , 21 , 23 , - 30 , - 49 , 21 , 30 , 30 } ;
System. out. println ( "排序之前:\n" + java. util. Arrays. toString ( data) ) ;
ShellSort ( data) ;
System. out. println ( "排序之后:\n" + java. util. Arrays. toString ( data) ) ;
}
}
九、冒泡排序
public class BubbleSort {
public static void bubbleSort ( int [ ] data) {
System. out. println ( "开始排序" ) ;
int arrayLength = data. length;
for ( int i = 0 ; i < arrayLength - 1 ; i++ ) {
for ( int j = 0 ; j < arrayLength - 1 - i; j++ ) {
if ( data[ j] > data[ j + 1 ] ) {
int temp = data[ j + 1 ] ;
data[ j + 1 ] = data[ j] ;
data[ j] = temp;
}
}
System. out. println ( java. util. Arrays. toString ( data) ) ;
}
}
public static void bubbleSort1 ( int [ ] data) {
System. out. println ( "开始排序" ) ;
int arrayLength = data. length;
for ( int i = 0 ; i < arrayLength - 1 ; i++ ) {
boolean flag = false ;
for ( int j = 0 ; j < arrayLength - 1 - i; j++ ) {
if ( data[ j] > data[ j + 1 ] ) {
int temp = data[ j + 1 ] ;
data[ j + 1 ] = data[ j] ;
data[ j] = temp;
flag = true ;
}
}
System. out. println ( java. util. Arrays. toString ( data) ) ;
if ( ! flag)
break ;
}
}
public static void main ( String[ ] args) {
int [ ] data = { 9 , - 16 , 21 , 23 , - 30 , - 49 , 21 , 30 , 30 } ;
System. out. println ( "排序之前:\n" + java. util. Arrays. toString ( data) ) ;
bubbleSort ( data) ;
System. out. println ( "排序之后:\n" + java. util. Arrays. toString ( data) ) ;
}
}
十、桶式排序
import java. util. Arrays;
public class BucketSort {
public static void bucketSort ( int [ ] data, int min, int max) {
System. out. println ( "开始排序" ) ;
int arrayLength = data. length;
int [ ] temp = new int [ arrayLength] ;
int [ ] buckets = new int [ max - min] ;
for ( int i = 0 ; i < arrayLength; i++ ) {
buckets[ data[ i] - min] ++ ;
}
System. out. println ( Arrays. toString ( buckets) ) ;
for ( int i = 1 ; i < max - min; i++ ) {
buckets[ i] = buckets[ i] + buckets[ i - 1 ] ;
}
System. out. println ( Arrays. toString ( buckets) ) ;
System. arraycopy ( data, 0 , temp, 0 , arrayLength) ;
for ( int k = arrayLength - 1 ; k >= 0 ; k-- ) {
data[ -- buckets[ temp[ k] - min] ] = temp[ k] ;
}
}
public static void main ( String[ ] args) {
int [ ] data = { 9 , 5 , - 1 , 8 , 5 , 7 , 3 , - 3 , 1 , 3 } ;
System. out. println ( "排序之前:\n" + java. util. Arrays. toString ( data) ) ;
bucketSort ( data, - 3 , 10 ) ;
System. out. println ( "排序之后:\n" + java. util. Arrays. toString ( data) ) ;
}
}
十一、堆排序
public class HeapSort {
public static void heapSort ( int [ ] data) {
System. out. println ( "开始排序" ) ;
int arrayLength = data. length;
for ( int i = 0 ; i < arrayLength - 1 ; i++ ) {
buildMaxdHeap ( data, arrayLength - 1 - i) ;
swap ( data, 0 , arrayLength - 1 - i) ;
System. out. println ( java. util. Arrays. toString ( data) ) ;
}
}
private static void buildMaxdHeap ( int [ ] data, int lastIndex) {
for ( int i = ( lastIndex - 1 ) / 2 ; i >= 0 ; i-- ) {
int k = i;
while ( k * 2 + 1 <= lastIndex) {
int biggerIndex = 2 * k + 1 ;
if ( biggerIndex < lastIndex) {
if ( data[ biggerIndex] - data[ biggerIndex + 1 ] < 0 ) {
biggerIndex++ ;
}
}
if ( data[ k] - data[ biggerIndex] < 0 ) {
swap ( data, k, biggerIndex) ;
k = biggerIndex;
} else {
break ;
}
}
}
}
private static void swap ( int [ ] data, int i, int j) {
int temp = data[ i] ;
data[ i] = data[ j] ;
data[ j] = temp;
}
public static void main ( String[ ] args) {
int [ ] data = { 9 , - 16 , 21 , 23 , - 30 , - 49 , 21 , 30 , 30 } ;
System. out. println ( "排序之前:\n" + java. util. Arrays. toString ( data) ) ;
heapSort ( data) ;
System. out. println ( "排序之后:\n" + java. util. Arrays. toString ( data) ) ;
}
}