插入排序: 有直接插入排序和希尔排序两种
直接插入排序代码:
public static void insertSort(int[] a){
int i, j, temp;
int n = a.length;
for(i = 0; i < n - 1; i ++){
temp = a[i + 1];
j = i;
while(j > -1 && temp <= a[j]){
a[j + 1] = a[j];
j --;
}
a[j + 1] = temp;
}
}
希尔排序:
public static void shellSort(int[] a, int[] d, int numOfD){
int i, j, k, m, span;
int temp;
int n = a.length;
for(m = 0; m < numOfD; m ++){ //共numOfD次循环
span = d[m]; //取本次的增量值
for(k = 0; k < span; k ++){ //共span个小组
for(i = k; i < n-span; i = i + span){
temp = a[i+span];
j = i;
while(j > -1 && temp <= a[j]){
a[j + span] = a[j];
j = j - span;
}
a[j + span] = temp;
}
}
}
}
选择排序:常用的选择排序方法直接选择排序、堆排序
直接选择排序
public static void selectSort(int[] a){
int i, j, small;
int temp;
int n = a.length;
for(i = 0; i < n - 1; i ++){
small = i; //设第i个数据元素最小
for(j = i + 1; j < n; j ++) //寻找最小的数据元素
if(a[j] < a[small]) small = j; //记住最小元素的下标
if(small != i){ //当最小元素的下标不为i时交换位置
temp = a[i];
a[i] = a[small];
a[small] = temp;
}
}
}
堆排序
public static void createHeap(int[] a, int n, int h){
int i, j, flag;
int temp;
i = h; // i为要建堆的二叉树根结点下标
j = 2 * i + 1; // j为i结点的左孩子结点的下标
temp = a[i];
flag = 0;
while(j < n && flag != 1){
//寻找左右孩子结点中的较大者,j为其下标
if(j < n - 1 && a[j] < a[j + 1]) j++;
if (temp > a[j]) flag = 1; //标记结束筛选条件
else{ //否则把a[j]上移
a[i] = a[j];
i = j;
j = 2 * i + 1;
}
}
a[i] = temp; //把最初的a[i]赋予最后的a[j]
}
交换排序:冒泡排序、快速排序
冒泡排序
public static void bubbleSort(int[] a){
int i, j, flag=1;
int temp;
int n = a.length;
for(i = 1; i < n && flag == 1; i++){
flag = 0;
for(j = 0; j < n-i; j++){
if(a[j] > a[j+1]){
flag = 1;
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
}
快速排序
public static void quickSort(int[] a, int low, int high){
int i, j;
int temp;
i = low;
j = high;
temp = a[low]; //取第一个元素为标准数据元素
while(i < j){
//在数组的右端扫描
while(i < j && temp <= a[j]) j–;
if(i < j){ a[i] = a[j]; i++; }
//在数组的左端扫描
while(i < j && a[i] < temp) i++;
if(i < j){ a[j] = a[i]; j–; }
}
a[i] = temp;
if(low < i) quickSort(a, low, i-1); //对左端子集合递归
if(i < high) quickSort(a, j+1, high); //对右端子集合递归
}
归并排序:
public static void merge(int[] a, int[] swap, int k){
int n = a.length;
int m = 0, u1,l2,i,j,u2;
int l1 = 0; //第一个有序子数组下界为0
while(l1 + k <= n-1){
l2 = l1 + k; //计算第二个有序子数组下界
u1 = l2 - 1; //计算第一个有序子数组上界
u2 = (l2+k-1 <= n-1)? l2+k-1: n-1;//计算第二个有序子数组上界
for(i = l1, j = l2; i <= u1 && j <= u2; m ++){
if(a[i] <= a[j]){
swap[m] = a[i];
i ++;
}
else{
swap[m] = a[j];
j++;
}
}
//子数组2已归并完,将子数组1中剩余的元素存放到数组swap中
while(i <= u1){
swap[m] = a[i];
m ++;
i ++;
}
//子数组1已归并完,将子数组2中剩余的元素存放到数组swap中
while(j <= u2){
swap[m] = a[j];
m ++;
j ++;
}
l1 = u2 + 1;
}
//将原始数组中只够一组的数据元素顺序存放到数组swap中
for(i = l1; i < n; i ++, m ++)
swap[m] = a[i];
}