插入排序
(1)直接插入排序
python实现
def InsertSort ( list1) :
for i in range ( 1 , len ( list1) ) :
temp = list1[ i]
j = i- 1
while j>= 0 and list1[ j] > temp:
list1[ j+ 1 ] = list1[ j]
list1[ j] = temp
j-= 1
else :
list1[ j+ 1 ] = temp
return list1
list1 = [ 2 , 5 , 1 , 4 , 7 , 3 , 0 , 8 , 9 ]
print ( InsertSort( list1) )
java实现
import java. util. Arrays;
public class Sort {
public static void main ( String [ ] args) {
int [ ] arr = new int [ ] { 49 , 38 , 65 , 97 , 76 , 13 , 27 , 49 , 55 , 4 } ;
InsertSort ( arr) ;
System. out. println ( Arrays. toString ( arr) ) ;
}
public static void InsertSort ( int [ ] arr) {
for ( int i = 1 , len = arr. length; i< len; i++ ) {
if ( arr[ i] < arr[ i- 1 ] ) {
int temp = arr[ i] ;
int j;
for ( j= i- 1 ; j>= 0 && arr[ j] > temp; j-- ) {
arr[ j+ 1 ] = arr[ j] ;
}
arr[ j+ 1 ] = temp;
}
}
}
}
(2)折半插入排序
python实现
def HalfSort ( list1) :
for i in range ( 1 , len ( list1) ) :
if list1[ i] < list1[ i- 1 ] :
low, high, temp = 0 , i- 1 , list [ i]
while low<= high:
mid = ( high+ low) / 2
if list1[ mid] > temp:
high = mid- 1
else :
low = mid + 1
j = i- 1
while j >= low:
list1[ j+ 1 ] = list1[ j]
j-= 1
list1[ low] = temp
return list1
list1 = [ 2 , 5 , 1 , 4 , 7 , 3 , 0 , 8 , 9 ]
print ( HalfSort( list1) )
java实现
import java. util. Arrays;
public class Sort {
public static void main ( String [ ] args) {
int [ ] arr = new int [ ] { 49 , 38 , 65 , 97 , 76 , 13 , 27 , 49 , 55 , 4 } ;
HalfSort ( arr) ;
System. out. println ( Arrays. toString ( arr) ) ;
}
public static void HalfSort ( int [ ] arr) {
int n = arr. length;
for ( int i = 1 ; i< n; i++ ) {
if ( arr[ i] < arr[ i- 1 ] ) {
int temp = arr[ i] ;
int low = 0 ;
int high = i- 1 ;
while ( low <= high) {
int mid = ( low+ high) / 2 ;
if ( arr[ mid] > temp) {
high = mid- 1 ;
} else {
low = mid+ 1 ;
}
}
for ( int j = i- 1 ; j>= low; j-- ) {
arr[ j+ 1 ] = arr[ j] ;
}
arr[ low] = temp;
}
}
}
}
(3)希尔排序
python实现
def ShellSort ( list1) :
length = len ( list1)
step = int ( length / 2 )
while step>= 1 :
i = step
while i < length:
if list1[ i] < list1[ i- step] :
temp = list1[ i]
j = i- step
while ( list1[ j] > temp and j >= 0 ) :
list1[ j+ step] = list1[ j]
j-= step
list1[ j+ step] = temp
i+= 1
step= int ( step/ 2 )
print ( list1)
return list1
list1 = [ 2 , 5 , 1 , 4 , 7 , 3 , 0 , 8 , 9 ]
list1 = [ 49 , 38 , 65 , 97 , 76 , 13 , 27 , 49 , 55 , 4 ]
print ( ShellSort( list1) )
java实现
希尔排序
import java. util. Arrays;
public class Sort {
public static void main ( String[ ] args) {
int [ ] array = new int [ ] { 2 , 5 , 1 , 4 , 7 , 3 , 0 , 8 , 9 } ;
int n = array. length;
for ( int step = n/ 2 ; step> 0 ; step/= 2 ) {
for ( int i= step; i< n; i++ ) {
for ( int j = i- step; j>= 0 ; j-= step) {
if ( array[ j] > array[ j+ step] ) {
int temp = array[ j+ step] ;
array[ j+ step] = array[ j] ;
array[ j] = temp;
}
}
}
}
System. out. println ( Arrays. toString ( array) ) ;
}
}
或者如下改进,减少交换次数
import java. util. Arrays;
public class HelloWorld {
public static void main ( String[ ] args) {
int [ ] array = new int [ ] { 49 , 38 , 65 , 97 , 76 , 13 , 27 , 49 , 55 , 04 } ;
int n = array. length;
for ( int step = n/ 2 ; step> 0 ; step/= 2 ) {
for ( int i= step; i< n; i++ ) {
if ( array[ i] < array[ i- step] ) {
int temp = array[ i] ;
int j;
for ( j = i- step; j>= 0 && array[ j] > temp; j-= step) {
array[ j+ step] = array[ j] ;
}
array[ j+ step] = temp;
}
}
System. out. println ( Arrays. toString ( array) ) ;
}
}
}
比较排序(交换排序)
(1)冒泡排序
Python实现
def BubbleSort ( list1) :
length = len ( list1)
for i in range ( length) :
for j in range ( 1 , length- i) :
if list1[ j] < list1[ j- 1 ] :
temp = list1[ j]
list1[ j] = list1[ j- 1 ]
list1[ j- 1 ] = temp
print ( list1)
return list1
list1 = [ 49 , 38 , 65 , 97 , 76 , 13 , 27 , 49 , 55 , 4 ]
print ( BubbleSort( list1) )
改进的冒泡排序Python(只要某一趟没有发生数据交换意味着排序结束,无需再空跑)
def BubbleSort ( list1) :
length = len ( list1)
for i in range ( length) :
flag = False
for j in range ( 1 , length- i) :
if list1[ j] < list1[ j- 1 ] :
temp = list1[ j]
list1[ j] = list1[ j- 1 ]
list1[ j- 1 ] = temp
flag = True
if flag == False :
break
print ( list1)
return list1
list1 = [ 49 , 38 , 65 , 97 , 76 , 13 , 27 , 49 , 55 , 4 ]
print ( BubbleSort( list1) )
或者使用while循环
def BubbleSort ( list1) :
length = len ( list1)
flag = True
while flag:
flag = False
for j in range ( 1 , length) :
if list1[ j] < list1[ j- 1 ] :
temp = list1[ j]
list1[ j] = list1[ j- 1 ]
list1[ j- 1 ] = temp
flag = True
print ( list1)
length -= 1
return list1
list1 = [ 49 , 38 , 65 , 97 , 76 , 13 , 27 , 49 , 55 , 4 ]
print ( BubbleSort( list1) )
java实现(未改进)
import java. util. Arrays;
public class Sort {
public static void main ( String[ ] args) {
int [ ] array = new int [ ] { 49 , 38 , 65 , 97 , 76 , 13 , 27 , 49 , 55 , 04 } ;
int n = array. length;
for ( int i = 0 ; i< n; i++ ) {
for ( int j= 1 ; j< n- i; j++ ) {
if ( array[ j] < array[ j- 1 ] ) {
int temp = array[ j] ;
array[ j] = array[ j- 1 ] ;
array[ j- 1 ] = temp;
}
}
System. out. println ( Arrays. toString ( array) ) ;
}
}
}
java实现(改进)
import java. util. Arrays;
public class HelloWorld {
public static void main ( String[ ] args) {
int [ ] array = new int [ ] { 49 , 38 , 65 , 97 , 76 , 13 , 27 , 49 , 55 , 04 } ;
int n = array. length;
for ( int i = 0 ; i< n; i++ ) {
boolean flag = false ;
for ( int j= 1 ; j< n- i; j++ ) {
if ( array[ j] < array[ j- 1 ] ) {
int temp = array[ j] ;
array[ j] = array[ j- 1 ] ;
array[ j- 1 ] = temp;
flag = true ;
}
}
if ( ! flag) {
break ;
}
System. out. println ( Arrays. toString ( array) ) ;
}
}
}
或者while循环
import java. util. Arrays;
public class Sort {
public static void main ( String[ ] args) {
int [ ] array = new int [ ] { 49 , 38 , 65 , 97 , 76 , 13 , 27 , 49 , 55 , 04 } ;
int len = array. length;
boolean flag = true ;
while ( flag) {
flag = false ;
for ( int i = 0 ; i < len - 1 ; i++ ) {
if ( array[ i] > array[ i + 1 ] ) {
int temp = array[ i + 1 ] ;
array[ i + 1 ] = array[ j] ;
array[ i] = temp;
flag = true ;
}
}
len-- ;
System. out. println ( Arrays. toString ( array) ) ;
}
}
}
(2)快速排序(默认第一个元素是枢轴值)
Python实现
def QuickSort ( list1, low, high) :
if low < high:
pivot = Separate( list1, low, high)
QuickSort( list1, low, pivot- 1 )
QuickSort( list1, pivot+ 1 , high)
return list1
def Separate ( list1, low, high) :
pivot = list1[ low]
while low< high:
while low < high and list1[ high] >= pivot:
high-= 1
list1[ low] = list1[ high]
while low < high and list1[ low] < pivot:
low+= 1
list1[ high] = list1[ low]
list1[ low] = pivot
return low
list1 = [ 49 , 38 , 65 , 97 , 76 , 13 , 27 , 49 , 55 , 4 ]
length = len ( list1)
result = QuickSort( list1, 0 , length- 1 )
print ( list1)
java实现
import java. util. Arrays;
public class Solution {
public static void main ( String[ ] args) {
QuickSort ( new int [ ] { 39 , 28 , 55 , 87 , 66 , 3 , 17 , 39 } ) ;
}
public static void QuickSort ( int [ ] arr) {
quickSort ( arr, 0 , arr. length- 1 ) ;
System. out. println ( Arrays. toString ( arr) ) ;
}
public static void quickSort ( int [ ] arr, int left, int right) {
int middle;
if ( left < right) {
middle = partition ( arr, left, right) ;
quickSort ( arr, left, middle- 1 ) ;
quickSort ( arr, middle+ 1 , right) ;
}
}
public static int partition ( int [ ] arr, int left, int right) {
int pivot = arr[ left] ;
while ( left < right) {
while ( left< right && arr[ right] >= pivot)
right-- ;
arr[ left] = arr[ right] ;
while ( left < right && arr[ left] <= pivot)
left++ ;
arr[ right] = arr[ left] ;
}
arr[ left] = pivot;
return left;
}
}
3选择排序
(1)简单选择排序
Python实现
def SelectSort ( list1) :
n = len ( list1)
for i in range ( 0 , n- 1 ) :
min = i
for j in range ( i+ 1 , n) :
if list1[ j] < list1[ min ] :
min = j
if min != i:
temp = list1[ i]
list1[ i] = list1[ min ]
list1[ min ] = temp
print ( list1)
return list1
list1 = [ 49 , 38 , 65 , 97 , 76 , 13 , 27 , 49 , 55 , 4 ]
print ( SelectSort( list1) )
java实现
import java. util. Arrays;
public class Sort {
public static void main ( String [ ] args) {
int [ ] arr = new int [ ] { 49 , 38 , 65 , 97 , 76 , 13 , 27 , 49 , 55 , 4 } ;
selectSort ( arr) ;
System. out. println ( Arrays. toString ( arr) ) ;
}
public static void selectSort ( int [ ] array) {
int n = array. length;
for ( int i = 0 ; i < n; i++ ) {
int minIndex = i;
for ( int j = i + 1 ; j < n; j++ ) {
if ( array[ minIndex] > array[ j] ) {
minIndex = j;
}
}
if ( i != minIndex) {
int temp = array[ i] ;
array[ i] = array[ minIndex] ;
array[ minIndex] = temp;
}
}
}
}
(2)堆排序大顶堆(大根堆)
Python实现(尽管有相应的第三方库,为了更好的了解这种二叉树数据结构,还是自己写一个吧)
def Heap_Sort ( arr) :
n = len ( arr)
max_index = n- 1
i = int ( ( max_index- 1 ) / 2 )
while i>= 0 :
AdjustHeap( arr, n, i)
i-= 1
j = n- 1
while j> 0 :
arr[ 0 ] , arr[ j] = arr[ j] , arr[ 0 ]
AdjustHeap( arr, j, 0 )
j-= 1
return arr
def AdjustHeap ( arr, n, i) :
leftchild = 2 * i+ 1
rightchild = 2 * i+ 2
largest_index = i
if ( leftchild< n and arr[ leftchild] > arr[ largest_index] ) :
largest_index = leftchild
if ( rightchild< n and arr[ rightchild] > arr[ largest_index] ) :
largest_index = rightchild
if largest_index!= i:
arr[ i] , arr[ largest_index] = arr[ largest_index] , arr[ i]
AdjustHeap( arr, n, largest_index)
list1 = [ 49 , 38 , 65 , 97 , 76 , 13 , 27 , 49 , 55 , 4 ]
print ( Heap_Sort( list1) )
java实现
import java. util. Arrays;
public class HelloWorld {
public static void main ( String [ ] args) {
int [ ] arr = new int [ ] { 49 , 38 , 65 , 97 , 76 , 13 , 27 , 49 , 55 , 4 } ;
heapSort ( arr) ;
System. out. println ( Arrays. toString ( arr) ) ;
}
public static void heapSort ( int [ ] array) {
int lastIndex = array. length - 1 ;
int startIndex = ( lastIndex - 1 ) / 2 ;
for ( int i = startIndex; i >= 0 ; i-- ) {
maxHeap ( array, array. length, i) ;
}
for ( int i = array. length - 1 ; i > 0 ; i-- ) {
int temp = array[ 0 ] ;
array[ 0 ] = array[ i] ;
array[ i] = temp;
maxHeap ( array, i, 0 ) ;
}
}
private static void maxHeap ( int [ ] data, int heapSize, int index) {
int leftChild = 2 * index + 1 ;
int rightChild = 2 * index + 2 ;
int largestIndex = index;
if ( leftChild < heapSize && data[ leftChild] > data[ largestIndex] ) {
largestIndex = leftChild;
}
if ( rightChild < heapSize && data[ rightChild] > data[ largestIndex] ) {
largestIndex = rightChild;
}
if ( largestIndex != index) {
int temp = data[ index] ;
data[ index] = data[ largestIndex] ;
data[ largestIndex] = temp;
maxHeap ( data, heapSize, largestIndex) ;
}
}
}
(3)二路归并排序
Python实现
def MergeSort ( arr, low, high) :
mid = int ( ( high + low) / 2 )
if ( low< high) :
MergeSort( arr, low, mid)
MergeSort( arr, mid+ 1 , high)
Merge( arr, low, mid, high)
return arr
def Merge ( arr, low, mid, high) :
temp = [ 0 ] * ( high- low+ 1 )
i, j, k = low, mid+ 1 , 0
while ( i<= mid and j<= high) :
if arr[ i] < arr[ j] :
temp[ k] = arr[ i]
i+= 1
else :
temp[ k] = arr[ j]
j+= 1
k+= 1
while ( i<= mid) :
temp[ k] = arr[ i]
k = k+ 1
i = i+ 1
while ( j<= high) :
temp[ k] = arr[ j]
j+= 1
k+= 1
for m in range ( len ( temp) ) :
arr[ m+ low] = temp[ m]
list1 = [ 49 , 38 , 65 , 97 , 76 , 13 , 27 , 49 , 55 , 4 ]
length = len ( list1)
print ( MergeSort( list1, 0 , length- 1 ) )
java实现
二路归并排序
import java. util. Arrays;
public class HelloWorld {
public static void main ( String [ ] args) {
int [ ] arr = new int [ ] { 49 , 38 , 65 , 97 , 76 , 13 , 27 , 49 , 55 , 4 } ;
mergeSort ( arr, 0 , arr. length- 1 ) ;
System. out. println ( Arrays. toString ( arr) ) ;
}
public static void mergeSort ( int [ ] array, int low, int high) {
int middle = ( low + high) / 2 ;
if ( low < high) {
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 k = 0 ;
while ( i <= middle && j <= high) {
if ( array[ i] < array[ j] ) {
temp[ k++ ] = array[ i++ ] ;
} else {
temp[ k++ ] = array[ j++ ] ;
}
}
while ( i <= middle) {
temp[ k++ ] = array[ i++ ] ;
}
while ( j <= high) {
temp[ k++ ] = array[ j++ ] ;
}
for ( int m = 0 ; m < temp. length; m++ ) {
array[ m + low] = temp[ m] ;
}
}
}