/**
* 插入排序
*
* @param a
* @param desc 升序
*/
public static void insert(Integer[] a, Integer desc) {
int i = 1;
int key = 0;
for (i = 1; i < a.length; i++) {
int k = i;
while (k > 0 && a[k] > a[k - 1]) {
int temp = a[k];
a[k] = a[k - 1];
a[k - 1] = temp;
k--;
}
key = a[i];
}
for (int k = 0; k < a.length; k++) {
System.out.print(a[k] + " ");
}
}
/**
* 选择排序法
*
* @param a
*/
public static void select(Integer[] a) {
for (int i = 0; i < a.length - 1; i++) {
int flag = i;
for (int j = i + 1; j < a.length; j++) {
if (a[j] < a[flag]) {
flag = j;
}
}
//a[i]与a[flag]交换位置
if (i != flag) {
int temp = a[i];
a[i] = a[flag];
a[flag] = temp;
}
System.out.print("选择排序第" + i + "步:");
for (int k = 0; k < a.length; k++) {
System.out.print(a[k] + " ");
}
System.out.println();
}
}
/**
* 分治法
*
* @param a 为合并的数组
* @param p 从下标 p开始
* @param q 下标中间 q
* @param r 下标r结束
*/
public static void merge(Integer[] a, Integer p, Integer q, Integer r) {
//创建两个数组,把对应的值放进去
Integer n1 = q - p + 1;
Integer[] L = new Integer[n1];
// 解释:r-(q+1)-1=r-q
Integer n2 = r - q;
Integer[] R = new Integer[n2];
for (int i = 0; i < n1; i++) {
L[i] = a[p + i];
}
for (int j = 0; j < n2; j++) {
R[j] = a[q+1+ j];
}
int i = 0, j = 0;
int k = p;
while(true){
if (i == n1 || j == n2) {
break;
}else{
if (L[i] <= R[j]) {
a[k] = L[i];
i++;
} else {
a[k] = R[j];
j++;
}
k++;
}
}
if(i==n1){
//说明L已经排序完
while(j<n2-1){
a[k++]=R[j++];
}
}else{
while(i<n1){
a[k++]=L[i++];
}
}
System.out.println("排序完的序列:");
for(int m=p;m<=r;m++){
System.out.print(a[m]+" ");
}
}
/**
* 合并排序
* @param a
* @param p
* @param r
*/
public static void merge_sort(Integer[] a,Integer p,Integer r){
int q=0;
if(p<r){
q=(p+r)/2;
merge_sort(a,p,q);
merge_sort(a,q+1,r);
merge(a,p,q,r);
}
}
《算法导论》中的算法实现
最新推荐文章于 2025-05-28 14:29:25 发布