关于归并算法的排序

[size=medium]
快速排序的算法是对数组形式的数据是非常好用的,但是对链表却是不建议使用了,今天有学习了链表的归并算法分析。自己的list是比较简单的实现,没有实现List接口。并且,该实现只是为了学习,考虑的情况都是在单核情况下,所以代码的不严谨,还请原谅。
开始贴代码了
[/size]

package com.mergesort;

import com.util.support.ListNode;
import com.util.support.Node;

/**
* 本实例是对单向链表的归并排序的实现
*
* @author Administrator
*
*/
public class MergeSort {

/**
* 分割节点
*
* @param top
* @return
*/
public static ListNode[] spitList(ListNode list) {

// 获得元list的length
int length = list.getLength();
// 裁剪的部分的长度
int amount = length / 2;

ListNode newList = new ListNode();

newList.addList(list, amount);

return new ListNode[] { newList, list };

}

public static void sortList(ListNode list) {
/**
* if list.length > 2 spit(list)===> left,right sortList(left)
* sortList(right); mergeList(left,right) else sortListSpecial(list);
*/
if (list.getLength() > 2) {
ListNode[] lists = spitList(list);

sortList(lists[0]);

sortList(lists[1]);

mergeList(lists[0], lists[1]);
} else if (list.getLength() == 2) {
realsortlist(list);
}
// 当当前的序列的长度是1或者zero的时候,我们可以不用排序

}

/**
* 对这个序列进行真正的排序,采用的是插入排序的算法
*
* @param list
*/
private static void realsortlist(ListNode list) {

Node current = list.getFirst();

while (current.getNext() != null) {
Node next = current.getNext();
if (current.getData() > next.getData()) {
// 从头开始进行比较
Node node = list.getFirst();
boolean insert = false;
while (!insert) {
if (node.getData() > next.getData()) {
swap(node, next);
insert = true;
} else {
node = node.getNext();
}
}
}
current = next;
}
}

/**
* Swap the node and the next Data
*
* @param node
* @param next
*/
private static void swap(Node node, Node next) {
int temp = node.getData();
node.setData(next.getData());
next.setData(temp);
}

/**
* 合并两个ListNode,将listNode 合并到listNode2中
*
* @param listNode
* @param listNode2
*/
/**
* define Node current to listNode define Node pdes to listNode2
*
* while(pdes != null)
*
* if(current.data < pdes.data) { insert current before pdes current =
* current.next; }else{ pdes = pdes.next;
*
* } insert currents after pdes
*
*
*/
private static void mergeList(ListNode listNode, ListNode listNode2) {

Node pdes = listNode2.getFirst();

Node temp = new Node(-1);

temp.setNext(pdes);
pdes = temp;
Node current = listNode.getFirst();

Node old;

while (pdes.getNext() != null) {
if (current == null)
break;

Node srcNode = pdes.getNext();

if (srcNode.getData() >= current.getData()) {
// 开始进入插入
old = current;
current = current.getNext();
old.setNext(srcNode);
pdes.setNext(old);
listNode2.length++;
}
pdes = pdes.getNext();
}

while (current != null) {
pdes.setNext(current);
pdes = current;
current = current.getNext();
listNode2.length++;
}

// 回收temp的资源
listNode2.setFirst(temp.getNext());

temp.setNext(null);

}

public static void main(String[] args) {

// ListNode list = new ListNode();
//
// list.add(1);
// list.add(3);
// list.add(2);
//
// realsortlist(list);
//
// Node first = list.getFirst();
//
// while(first != null)
// {
// System.out.println(first.getData());
// first = first.getNext();
// }
//
// ListNode list1 = new ListNode();
//
// list1.add(1);
// list1.add(3);
// list1.add(5);
//
// ListNode list2 = new ListNode();
//
// list2.add(2);
// list2.add(4);
// list2.add(6);
//
// mergeList(list1, list2);
//
// System.out.println("list 的长度" + list2.length);;
//
// printList(list2);
//
// //分割的测试
// System.out.println(" 开始进行分割测试");
// ListNode[] lists = spitList(list2);
//
// for(ListNode list : lists)
// {
// System.out.println("list的长度" + list.length);
// printList(list);
// }

// 开始进行测试归并排序算法
int[] arrays = new int[] { 128, 137, 145, 55, 532, 99, 12, 3, 1000,
255 };
ListNode list = initListNode(arrays);

sortList(list);

printList(list);
}

private static ListNode initListNode(int[] arrays) {

ListNode list = new ListNode();

for (int data : arrays) {
list.add(data);
}

return list;

}

private static void printList(ListNode list) {
Node first = list.getFirst();

while (first != null) {
System.out.print(first.getData() + " ");
first = first.getNext();
}

System.out.println();
}
}


经过初步的测试,发现是能够进行排序的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值