一、冒泡排序
基本原理:拿每个数与它的后一位数进行比较,如果前一位比后一位大,则调换位置。每轮比较都会将比较过的数中最大的放到最后面,下一轮会少比较一次。 其代码只要有两层循环构成,外层循环控制比较的轮数,内层循环控制每轮比较比较的次数,并判断如果前一位比后一位大,则调换其位置,继续比较下一个数。
package BubbleSort;
import java. util. Arrays;
public class BubbleSort {
public static void main ( String[ ] ages) {
int array[ ] = new int [ ] { 3 , 4 , 1 , 8 , 2 , 6 , 9 , 5 } ;
System. out. println ( "排序之前:" + Arrays. toString ( array) ) ;
bubbleSort ( array) ;
System. out. println ( "排序之后:" + Arrays. toString ( array) ) ;
}
public static void bubbleSort ( int array[ ] ) {
for ( int i= 0 ; i< array. length- 1 ; i++ ) {
for ( int j= 0 ; j< array. length- 1 - i; j++ ) {
if ( array[ j] > array[ j+ 1 ] ) {
int dex = array[ j] ;
array[ j] = array[ j+ 1 ] ;
array[ j+ 1 ] = dex;
}
}
}
}
}
运行截图:
二、快速排序
基本原理:一般将数组的第一个元素设置为基准数,记录排序的下标(开始元素下标,结束元素下标)。拿左右两端的元素与基准数作比较,右边:如果比基准数大记录排序的下标(结束元素的下标)向前移动一位,比基准数小的话用该元素替换开始数。左边:如果比基准数小的话记录排序的下标(开始元素的下标)向后移动一位,比基准数大的话用该元素替换结束元素。当记录排序的下标重合后,用基准数替换开始元素。然后以采用迭代的方式重新调用该方法将比基准数大和比基准数小的元素进行排序。
package QuickSort;
import java. util. Arrays;
public class QuickSort {
public static void main ( String[ ] args) {
int array[ ] = new int [ ] { 4 , 1 , 5 , 2 , 6 , 3 , 7 , 9 , 8 } ;
System. out. println ( "排序之前:" + Arrays. toString ( array) ) ;
quicksort ( array, 0 , array[ array. length- 1 ] ) ;
System. out. println ( "排序之后:" + Arrays. toString ( array) ) ;
}
public static void quicksort ( int array[ ] , int start, int end) {
if ( start< end) {
int stard = array[ start] ;
int low = start;
int high = end;
while ( low< high) {
while ( low< high&& stard<= array[ high] ) {
high-- ;
}
array[ low] = array[ high] ;
while ( low< high&& stard>= array[ low] ) {
low++ ;
}
array[ high] = array[ low] ;
}
array[ low] = stard;
quicksort ( array, start, low) ;
quicksort ( array, low+ 1 , end) ;
}
}
}
运行截图:
三、插入排序
原理:其主要由两层循环控制,外层循环控制遍历除了第一个元素以外的所有元素,判断,如果当前元素小于它前面的元素,则把它赋给一个新元素。内层循环控制遍历前面的所有元素,判断如果内层循环的当前元素大于外层循环取出的元素,则将该元素赋值给其后面的元素,内层循环结束后将外层循环取出的元素赋值给内层循环当前元素的下一个元素。
package InsertSort;
import java. util. Arrays;
public class InsertSort {
public static void main ( String[ ] ages) {
int array[ ] = new int [ ] { 4 , 1 , 5 , 2 , 6 , 3 , 7 , 8 , 9 } ;
System. out. println ( "排序之前:" + Arrays. toString ( array) ) ;
insertSort ( array) ;
System. out. println ( "排序之后:" + Arrays. toString ( array) ) ;
}
public static void insertSort ( int array[ ] ) {
for ( int i= 1 ; i< array. length; i++ ) {
if ( array[ i] < array[ i- 1 ] ) {
int nex = array[ i] ;
int j;
for ( j= i- 1 ; j>= 0 ; j-- ) {
if ( nex< array[ j] )
array[ j+ 1 ] = array[ j] ;
}
array[ j+ 1 ] = nex;
}
}
}
}
运行截图:
四、希尔排序
基本原理:将整个数组分为步长相等的几个部分,分别进行插入排序。主要由三层循环构成,第一次循环控制遍历步长,第二次循环控制遍历所有元素,第三次循环控制遍历每组的元素,并判断,如果当前元素大于加上步长的元素,则交换位置。
package ShellSort;
import java. util. Arrays;
public class ShellSort {
public static void main ( String[ ] ages) {
int array[ ] = new int [ ] { 4 , 1 , 7 , 5 , 2 , 8 , 6 , 9 , 3 } ;
System. out. println ( " 排序之前:" + Arrays. toString ( array) ) ;
shellSort ( array) ;
System. out. println ( " 排序之后:" + Arrays. toString ( array) ) ;
}
public static void shellSort ( int array[ ] ) {
int k= 1 ;
for ( int d = array. length/ 2 ; d> 0 ; d= d/ 2 ) {
for ( int i= d; i< array. length; i++ ) {
for ( int j= i- d; j>= 0 ; j= j- d) {
if ( array[ j] > array[ j+ d] ) {
int dex = array[ j+ d] ;
array[ j+ d] = array[ j] ;
array[ j] = dex;
}
}
}
System. out. println ( "第" + k+ "次排序:" + Arrays. toString ( array) ) ;
k++ ;
}
}
}
运行截图:
五、选择排序
基本原理:主要由两次循环构成,第一层循环控制遍历所有的元素,第二层循环控制遍历当前元素后面的所有元素,每次循环找出最小元素的下标与当前元素的下标进行对比,如果不是同一个元素的话调换位置,把最小的元素放到对前面。
package SelectSort;
import java. util. Arrays;
public class SelectSort {
public static void main ( String[ ] ages) {
int array[ ] = new int [ ] { 1 , 4 , 7 , 5 , 2 , 8 , 6 , 3 , 9 } ;
System. out. println ( "排序之前:" + Arrays. toString ( array) ) ;
selectSort ( array) ;
System. out. println ( "排序之后:" + Arrays. toString ( array) ) ;
}
public static void selectSort ( int array[ ] ) {
for ( int i= 0 ; i< array. length; i++ ) {
int min= i;
for ( int j= i+ 1 ; j< array. length; j++ ) {
if ( array[ min] > array[ j] ) {
min = j;
}
}
if ( min != i) {
int temp = array[ i] ;
array[ i] = array[ min] ;
array[ min] = temp;
}
}
}
}
运行截图:
六、归并排序
基本原理:归并排序采用分治法,首先对运用递归对数组进行分割,当分割到不能再分割的时候再进行合并,遍历取出最小的数放入临时数组中,遍历到最后直接将多余的元素放入零时数组中,再将临时数组放入原来的数组中去。
package MergrSort;
import java. util. Arrays;
public class MergeSort {
public static void main ( String[ ] args) {
int array[ ] = new int [ ] { 4 , 1 , 7 , 5 , 2 , 8 , 6 , 3 , 9 } ;
System. out. println ( "排序之前:" + Arrays. toString ( array) ) ;
mergeSort ( array, 0 , array. length- 1 ) ;
System. out. println ( "排序之后:" + Arrays. toString ( array) ) ;
}
public static void mergeSort ( int array[ ] , int low, int high) {
if ( low< high) {
int middle= ( low+ high) / 2 ;
mergeSort ( array, low, middle) ;
mergeSort ( array, middle+ 1 , high) ;
merge ( array, low, middle, high) ;
}
}
public static void merge ( int array[ ] , int low, int middle, int high) {
int temp[ ] = new int [ high- low+ 1 ] ;
int i = low;
int j = middle+ 1 ;
int dex = 0 ;
while ( i<= middle&& j<= high) {
if ( array[ i] < array[ j] ) {
temp[ dex] = array[ i] ;
i++ ;
} else {
temp[ dex] = array[ j] ;
j++ ;
}
dex++ ;
}
while ( i<= middle) {
temp[ dex] = array[ i] ;
dex++ ;
}
while ( j<= high) {
temp[ dex] = array[ j] ;
dex++ ;
}
for ( int k= 0 ; k< temp. length; k++ ) {
array[ k+ low] = temp[ k] ;
}
}
}
运行截图:
七、基数排序
基本原理:基数排序是一种非比较的排序方法,它将数组中的每个元素元素分别按照个位数,百位数,一直到最大位数分别存放的是个有对应序号的数组中(一个二维数组),并且按照放入时的顺序取出来,放入原来的数组中去。
package RadixSort;
import java. util. Arrays;
public class RadixSort {
public static void main ( String[ ] args) {
int array[ ] = new int [ ] { 45 , 126 , 7 , 66 , 548 , 69 , 36 , 5 } ;
System. out. println ( "排序之前:" + Arrays. toString ( array) ) ;
radixsort ( array) ;
System. out. println ( "排序之后:" + Arrays. toString ( array) ) ;
}
public static void radixsort ( int array[ ] ) {
int max = Integer. MAX_VALUE ;
for ( int i= 0 ; i< array. length; i++ ) {
if ( array[ i] > max) {
max = array[ i] ;
}
}
int maxlength = ( max+ "" ) . length ( ) ;
int temp[ ] [ ] = new int [ 10 ] [ array. length] ;
int counts[ ] = new int [ 10 ] ;
for ( int i= 0 , n= 1 ; i< maxlength; i++ , n*= 10 ) {
for ( int j= 0 ; j< array. length; j++ ) {
int ys = array[ j] / n% 10 ;
temp[ ys] [ counts[ ys] ] = array[ j] ;
counts[ ys] ++ ;
}
int index = 0 ;
for ( int k= 0 ; k< counts. length; k++ ) {
if ( counts[ k] != 0 ) {
for ( int l= 0 ; l< counts[ k] ; l++ ) {
array[ index] = temp[ k] [ l] ;
index++ ;
}
counts[ k] = 0 ;
}
}
}
}
}
运行截图: