基于链表存储方式的自然合并排序算法
这一篇博客就是我对我上一篇基于数组的算法的简单更改版,改成了链表,本篇很水,只是为了记录一下,没什么质量
package zuoye;
import java.util.Collections;
import java.util.LinkedList;
public class Main {
public static void main(String[] args) {
LinkedList<Integer> list = new LinkedList<Integer>();
LinkedList<Integer> listb = new LinkedList<Integer>(); //定义一个listb链表用来储存list链表在分类时的位置
LinkedList<Integer> listtemp = new LinkedList<Integer>();
int l,m,h;
for(int i = 0;i<10;i++){
list.add(i); //链表初始化
}
for(int i = 0;i<10;i++){
listb.add(0); //链表初始化
}
for(int i = 0;i<10;i++){
listtemp.add(0); //链表初始化
}
Collections.shuffle(list); //随机打乱list链表
System.out.println(list); //输出打乱后的list链表
int k = classify(list,listb); //定义k代表链表listb的最后一位
for(int i=0;i<k;i++) {
l=0;
m=listb.get(i);
h=listb.get(i+1);
mergeSort(list,listtemp,l,m,h); //对list链表进行归并排序
}
System.out.println(list); //输出排序好的list链表
}
public static int classify(LinkedList<Integer> list,LinkedList<Integer> listb) {
int k = 0;
for(int i=0;i<list.size()-1;i++) {
int j = i+1;
if(list.get(i)>list.get(j)) {
listb.set(k, i); //链表listb用来存储list链表分类的位置
k++;
}
}
listb.set(k, list.size()-1);
return k; //返回k
}
public static void mergeSort(LinkedList<Integer> list, LinkedList<Integer> listtemp, int left, int middle,int right) {
int i = left;
int j = middle + 1;
int k = 0;
while (i <= middle && j <= right) {
if (list.get(i) < list.get(j)) {
listtemp.set(k, list.get(i)); //分别将对应的数放入listtemp链表中
k++;
i++;
}
else {
listtemp.set(k, list.get(j)); //分别将对应的数放入listtemp链表中
k++;
j++;
}
}
while (i <= middle) {
listtemp.set(k, list.get(i)); //将未进行比较的数存入listtemp链表中
k++;
i++;
}
while (j <= right) {
listtemp.set(k, list.get(j)); //将未进行比较的数存入listtemp链表中
k++;
j++;
}
for (int i1 = 0; i1 < k; i1++) {
list.set(i1+left, listtemp.get(i1)); //将listtemp链表所存储的数放入list链表中
}
}
}