快速排序的算法是对数组形式的数据是非常好用的,但是对链表却是不建议使用了,今天有学习了链表的归并算法分析。自己的list是比较简单的实现,没有实现List接口。并且,该实现只是为了学习,考虑的情况都是在单核情况下,所以代码的不严谨,还请原谅。
开始贴代码了
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();
}
}
经过初步的测试,发现是能够进行排序的。
分享到:
相关推荐
二路归并算法 排序 归并排序
自己编写的基于java的快速排序和归并算法
C语言算法之归并排序C语言算法之归并排序C语言算法之归并排序C语言算法之归并排序
根据算法导论实现的归并排序算法
C语言二路归并排序算法, 写了个二路归并的归并排序小代码,直接贴上来
本人自己写的一些排序算法,这是系列1归并排序算法实现,
易语言归并排序算法源码,归并排序算法,归并排序,子程序_有序数组合并
算法设计,给出归并排序的C++实现代码,并利用给随机数方式求运行时间
MATLAB实现《算法设计与分析》中的插入排序、二分归并排序、归并排序实验,其中包括.m文件和实验报告,安徽大学本科课程。
归并排序算法,有程序和复杂性分析,还有解释,挺清楚的,很有用
快速排序、归并排序、基数排序等排序算法比较,比较时间性能,采用C++语言实现。。。
算法设计实验报告,包括:快速排序和归并排序两种算法各自的基本思想、时间复杂度分析,C++实现代码,两种算法运行时间的比较,运行截图,实验心得。
归并排序算法C语言版
算法练习,仅供参考 用递归实现的一个归并算法 void Merge(int *A,int p,int q,int r)实现对已排序的两部分合并 void Merge_sort(int *A,int p,int r) 调用上述函数实现排序
归并算法思想总结
完整的实现了归并排序的算法,使用C语言实现,相信看过本程序之后,会对归并排序了如指掌
C++实现希尔、快速、堆排序、归并排序算法,一些中文注释可能成乱码了,但是不影响代码执行。
这是关于归并排序算法用C语言实现的代码,是经过测试正确的,希望能对大家的学习有所帮助。
C++归并排序算法程序,很好,谨供大家参考
对于归并算法的四点改进 1.不回写,可以减少一半的数组移动 2.不递归 ,可以加快执行速度 3.无逆序,分段的时候递增的为一段,段数不确定 4.与插入相结合,因为数列个数在16以内的话插入排序会比归并排序要快