1.选择排序
(1)原理:
在要排序的一组数中,用第一个数与后面的数依次进行判断,若大于后面的则进行交换;然后依次再用第二个数与后面的数进行交换,如此循环到倒数第二个数和最后一个数比较为止。
(2)图解:
内层第一次循环如下:
外层控制循环次数:
- 代码:
public static void selectSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) { //使用嵌套循环,注意循环次数为数组长度减1
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
2.冒泡排序
(1)原理:
在要排序的一组数中,从头开始用相邻的两个数依次进行比较,若第一个数大则调换位置,就这样让较大的数往下沉,较小的往上冒。如此循环到倒数第二个数和最后一个数比较为止。
(2)图解:
(3)代码:
public static void bubbleSort(int[] arr){
for (int i = 0; i < arr.length-1; i++) { //外层循环确定循环次数:数组长度减1
for (int j = 0; j < arr.length-1-i; j++) {//内层循环比较相邻的元素,注意循环长度随着确定个数递减
if (arr[j] > arr[j + 1]) {
int tem = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tem;
}
}
}
}
3.插入排序
(1)原理:
在要排序的一组数中,先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。
(2)图解:(下图黑色方框为排好序的,有下划线是需要进行排序的数字,箭头为插入的位置)
(3)代码:
public static void inserSort(int[] arr){
for (int i = 1; i < arr.length; i++) {
int j;
int num=arr[i];
for ( j=i;j>0&&arr[j-1]>num;j--){
arr[j]=arr[j-1];
}
arr[j]=num;
}
}
4.希尔排序
(1)原理:
在要排序的一组数中,先将整个待排序的记录序列按某个增量d(n/2,n为要排序数的个数)分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。
- 图解:
(3)代码:
public static void shellSort1(int[] arr) {
int dk = arr.length/2;
while( dk >= 1 ){
ShellSort2(arr, dk);
dk = dk/2;
}
}
private static void ShellSort2(int[] a, int dk) {//类似插入排序,只是插入排序增量是1,这里增量是dk,把1换成dk就可以了
for(int i=dk;i<a.length;i++){
if(a[i]<a[i-dk]){
int j;
int x=a[i];//x为待插入元素
a[i]=a[i-dk];
for(j=i-dk; j>=0 && x<a[j];j=j-dk){//通过循环,逐个后移一位找到要插入的位置。
a[j+dk]=a[j];
}
a[j+dk]=x;//插入
}
}
}