排序的四种算法(参考邓俊辉老师的课程)
1.冒泡排序2.归并排序3.选择排序(后缀有序)4.插入排序(前缀有序)
1.冒泡排序
package yudi
.sort
;
public class BubbleSort {
public static void bubbleSort(int[] array
,int n
){
for (boolean sorted
= false; sorted
= !sorted
; n
--){
for (int i
= 1; i
< n
; i
++){
if (array
[i
] < array
[i
- 1]){
int temp
= array
[i
];
array
[i
] = array
[i
- 1];
array
[i
- 1] = temp
;
sorted
= false;
}
}
}
}
public static void bubbleSortImprove(int[] array
,int n
){
while (0 < (n
= findInversionSequenceIndex(array
,n
)));
}
public static int findInversionSequenceIndex(int[] array
, int n
){
int index
= 0;
for (int i
= 1; i
< n
; i
++) {
if (array
[i
] < array
[i
- 1]) {
int temp
= array
[i
];
array
[i
] = array
[i
- 1];
array
[i
- 1] = temp
;
index
= i
;
}
}
return index
;
}
public static void main(String
[] args
) {
int[] array
= {5,4,3,6,10,9,2,3,4};
bubbleSortImprove(array
, array
.length
);
for (int i
=0; i
< array
.length
; i
++){
System
.out
.print(array
[i
] +" ");
}
}
}
2.归并排序
归并排序的思想:分而治之——首先将数组分为两半递归排序,然后合并有序子序列 1.mergeSort
public static void mergeSort(int[] array
, int low
,int high
){
if (high
- low
< 2) return;
int middle
= (low
+ high
) >> 1;
mergeSort(array
, low
, middle
);
mergeSort(array
, middle
, high
);
merge(array
, low
, middle
, high
);
Util
.ptingArray(array
);
}
2.merge
public static void merge(int[] array
, int low
, int middle
, int high
){
int lB
= middle
- low
;
int temp
= low
;
int[] tempB
= new int[lB
];
for (int i
= 0; i
< lB
; i
++){
tempB
[i
] = array
[temp
++];
}
for (int i
= low
,j
= 0,k
= middle
; j
< lB
;){
if (k
< high
&& array
[k
] < tempB
[j
]) array
[i
++] = array
[k
++];
if (high
<= k
|| tempB
[j
] <= array
[k
]) array
[i
++] = tempB
[j
++];
}
}
各个参数的意义如下图所示: 3.测试
public static void main(String
[] args
) {
int[] array
= {4,8,6,8,2,4,5,98};
mergeSort(array
,0,array
.length
);
System
.out
.println("====================");
Util
.ptingArray(array
);
}
3.选择排序(后缀有序)
package yudi
.sort
;
import yudi
.util
.Util
;
public class SelectionSort {
public static void selectionSort(int[] array
, int n
){
int maxIndex
= 0;
while (1 < n
){
maxIndex
= selectMaxIndex(array
, n
);
int temp
= array
[maxIndex
];
array
[maxIndex
] = array
[n
- 1];
array
[n
- 1] = temp
;
n
--;
}
}
public static int selectMaxIndex(int[] array
, int n
){
int max
= 0;
for (int i
= 0; i
< n
- 1; i
++){
if (array
[max
] < array
[i
+ 1]){
max
= i
+ 1;
}
}
return max
;
}
public static void main(String
[] args
) {
int[] array
= {4,8,6,85,2,4,5,98};
selectionSort(array
,array
.length
);
Util
.ptingArray(array
);
}
}
4.插入排序(前缀有序)
public class InsertionSort {
public static void insertionSort(int[] array
, int n
){
for (int index
= 1; index
< n
; index
++){
int tmp
= array
[index
];
int leftIndex
= index
- 1;
while (leftIndex
>= 0 && array
[leftIndex
] > tmp
){
array
[leftIndex
+ 1] = array
[leftIndex
];
leftIndex
--;
}
array
[leftIndex
+ 1] = tmp
;
}
}
public static void main(String
[] args
) {
int[] array
= {4,8,6,85,2,4,5,98};
insertionSort(array
,array
.length
);
Util
.ptingArray(array
);
}
}
转载请注明原文地址:https://ipadbbs.8miu.com/read-48188.html