`
暗夜骑士0376
  • 浏览: 81499 次
  • 性别: Icon_minigender_1
  • 来自: 信阳
社区版块
存档分类
最新评论

关于归并算法的排序

 
阅读更多

快速排序的算法是对数组形式的数据是非常好用的,但是对链表却是不建议使用了,今天有学习了链表的归并算法分析。自己的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语言实现进行详细解析。 ### 快速排序算法 快速排序是一种高效的排序算法,采用分而治之的策略,其核心思想是选择一个...

    归并排序算法实现(排序算法系列1)

    归并排序是一种高效的、稳定的排序算法,由著名计算机科学家John W. Backus在1946年提出。它是基于分治策略的一种经典算法,适用于处理大量数据。在本系列的第一部分,我们将深入探讨归并排序的基本原理、实现过程...

    MATLAB实现插入排序、二分归并排序、归并排序.rar

    在本资源中,我们主要关注的是使用MATLAB编程语言实现三种经典的排序算法:插入排序、二分归并排序以及归并排序。这些算法是计算机科学基础中的重要组成部分,特别是在算法设计与分析领域。MATLAB是一种强大的数值...

    归并排序算法实现

    ### 归并排序算法实现详解 #### 一、引言 归并排序是一种经典的排序算法,采用分治法的思想,将待排序数组分为若干个子序列,这些子序列是已排序的,然后再按照一定的方式合并这些子序列得到最终排序后的数组。...

    如何使用Java实现归并排序算法,程序详细解读

    归并排序:如何使用Java实现归并排序算法,程序详细解读; 归并排序:如何使用Java实现归并排序算法,程序详细解读; 归并排序:如何使用Java实现归并排序算法,程序详细解读; 归并排序:如何使用Java实现归并排序...

    C语言二路归并排序算法

    ### C语言二路归并排序算法 #### 概述 归并排序是一种高效的排序算法,其基本思想是采用分治法(Divide and Conquer),将一个数组分成两个子数组,然后递归地对这两个子数组进行排序,最后将两个有序的子数组合并...

    归并排序算法(计算机算法与分析)

    归并排序算法是一种高效稳定的排序方法,其基本思想源于分治法。该算法将一个大问题分解成两个或更多的小问题来解决,然后再合并这些小问题的解,从而得到最终的大问题的解。在归并排序中,我们将一个大的数组分割成...

    C++实现希尔、快速、堆排序、归并排序算法

    本文将详细介绍C++中实现的希尔排序、快速排序、堆排序和归并排序这四种经典排序算法。 希尔排序,由Donald Shell于1959年提出,是一种改进的插入排序。它的基本思想是通过设置一个增量序列,将待排序的元素按照...

    改进的归并排序算法

    归并排序(Merge Sort)是一种基于分治策略的高效排序算法。它的基本思想是将大问题分解成小问题,然后逐个解决小问题,最后再将解决好的小问题合并成解决大问题。在这个过程中,归并排序通常采用递归的方式来实现。...

    算法设计实验报告-快速排序和归并排序

    本实验旨在通过对两种经典排序算法——快速排序和归并排序的研究与实现,深入理解它们的基本原理、时间复杂度,并通过编程实践比较这两种算法在不同数据规模下的性能表现。 #### 二、快速排序 **1. 基本思想** ...

    快速排序与归并排序的算法比较实验报告

    **快速排序与归并排序算法比较实验报告** 在计算机科学中,排序算法是处理大量数据时不可或缺的一部分。这篇实验报告将深入探讨两种经典的排序算法——快速排序和归并排序,通过对它们在Java环境中的实现和性能测试...

    归并算法思想总结

    归并算法是一种典型的分治策略在排序领域的应用,其核心思想在于将一个大规模的问题分解成若干个较小的、容易解决的子问题,然后将这些子问题的解合并,得到整个问题的解。在归并排序中,这一策略体现得尤为明显。 ...

    算法设计-归并排序

    算法设计,给出归并排序的C++实现代码,并利用给随机数方式求运行时间

    C语言算法之归并排序C语言算法之归并排序

    - **稳定性**: 归并排序是稳定的排序算法,这意味着相等的元素在排序前后保持原有的相对顺序。 - **高效性**: 不管输入数据如何,归并排序始终能保持`O(n log n)`的时间复杂度。 - **适用范围**: 归并排序适用于各种...

    理解归并排序的算法思想及其算法设计

    理解归并排序的算法思想及其算法设计 本资源摘要信息将深入讨论归并排序的算法思想及其算法设计,涵盖了归并排序的定义、算法思路、实现过程、时间复杂度分析等方面的内容。同时,本资源摘要信息还将介绍基数排序...

    快速排序、归并排序等排序算法比较

    快速排序、归并排序、基数排序等排序算法比较,比较时间性能,采用C++语言实现。。。

    归并排序(Merge sort)(台灣譯作:合併排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

    归并排序(Merge Sort)是一种基于分治策略的高效排序算法,由计算机科学家John W. Backus于1945年提出。它的工作原理可以分为三个主要步骤:分解、解决和合并。 1. 分解:将原始数据序列分成两个相等(或接近相等...

    归并排序算法C语言版

    归并排序算法C语言版

Global site tag (gtag.js) - Google Analytics