`
hideto
  • 浏览: 2666553 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

四种排序算法学习

阅读更多
无聊中eMule了一份中文版的<<算法导论>>来看,发现是1993年出版的古物,寒。
在网上google一通,发现一个网站Computer Programming Algorithms Directory,进去先看看Sorting Algorithms部分。
所以今天学习了一下四种排序算法,见Andrew Kitchen的Sorting Algorithms的applet动画显示。

Bubble Sort
/*
 * @(#)BubbleSortAlgorithm.java	1.6f 95/01/31 James Gosling
 *
 * Copyright (c) 1994-1995 Sun Microsystems, Inc. All Rights Reserved.
 *
 * Permission to use, copy, modify, and distribute this software
 * and its documentation for NON-COMMERCIAL or COMMERCIAL purposes and
 * without fee is hereby granted. 
 * Please refer to the file http://java.sun.com/copy_trademarks.html
 * for further important copyright and trademark information and to
 * http://java.sun.com/licensing.html for further important licensing
 * information for the Java (tm) Technology.
 * 
 * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
 * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
 * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
 * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
 * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
 * 
 * THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE
 * CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE
 * PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT
 * NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE
 * SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE
 * SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE
 * PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES").  SUN
 * SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR
 * HIGH RISK ACTIVITIES.
 */

/**
 * A bubble sort demonstration algorithm
 * SortAlgorithm.java, Thu Oct 27 10:32:35 1994
 *
 * @author James Gosling
 * @version 	1.6f, 31 Jan 1995
 */
class BubbleSortAlgorithm extends SortAlgorithm {
    void sort(int a[]) throws Exception {
	for (int i = a.length; --i>=0; )
	    for (int j = 0; j<i; j++) {
		if (stopRequested) {
		    return;
		}
		if (a[j] > a[j+1]) {
		    int T = a[j];
		    a[j] = a[j+1];
		    a[j+1] = T;
		}
		pause(i,j);
	    }
	pause(-1,-1);
    }
}

Bubble Sort is a sequential algorithm, with an average case time of O(n2).
经典的冒泡排序。这种方法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮。在冒泡排序算法中我们要对这个“气泡”序列处理
若干遍。所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。如果发现两个相邻元素的顺序不对,即“轻”的元素在下面,就交换它
们的位置。显然,处理一遍之后,“最轻”的元素就浮到了最高位置;处理二遍之后,“次轻”的元素就浮到了次高位置。在作第二遍处理时,由于最高位置上的元素已是“最
轻”元素,所以不必检查。一般地,第i遍处理时,不必检查第i高位置以上的元素,因为经过前面i-1遍的处理,它们已正确地排好序。
以上解释来自http://algorithm.diy.myrice.com/algorithm/commonalg/sort/internal_sorting/bubble_sort/bubble_sort.htm

Quick Sort
/*
 * @(#)QSortAlgorithm.java	1.6f 95/01/31 James Gosling
 *
 * Copyright (c) 1994-1995 Sun Microsystems, Inc. All Rights Reserved.
 *
 * Permission to use, copy, modify, and distribute this software
 * and its documentation for NON-COMMERCIAL or COMMERCIAL purposes and
 * without fee is hereby granted. 
 * Please refer to the file http://java.sun.com/copy_trademarks.html
 * for further important copyright and trademark information and to
 * http://java.sun.com/licensing.html for further important licensing
 * information for the Java (tm) Technology.
 * 
 * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
 * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
 * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
 * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
 * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
 * 
 * THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE
 * CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE
 * PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT
 * NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE
 * SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE
 * SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE
 * PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES").  SUN
 * SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR
 * HIGH RISK ACTIVITIES.
 */

/**
 * A quick sort demonstration algorithm
 * SortAlgorithm.java, Thu Oct 27 10:32:35 1994
 *
 * @author James Gosling
 * @version 	1.6f, 31 Jan 1995
 */
class QSortAlgorithm extends SortAlgorithm {
    void sort(int a[], int lo0, int hi0) throws Exception {
	int lo = lo0;
	int hi = hi0;
	pause(lo, hi);
	if (lo >= hi) {
	    return;
	}
	int mid = a[(lo + hi) / 2];
	while (lo < hi) {
	    while (lo<hi && a[lo] < mid) {
		lo++;
	    }
	    while (lo<hi && a[hi] > mid) {
		hi--;
	    }
	    if (lo < hi) {
		int T = a[lo];
		a[lo] = a[hi];
		a[hi] = T;
		pause();
	    }
	}
	if (hi < lo) {
	    int T = hi;
	    hi = lo;
	    lo = T;
	}
	sort(a, lo0, lo);
	sort(a, lo == lo0 ? lo+1 : lo, hi0);
    }

    void sort(int a[]) throws Exception {
	sort(a, 0, a.length-1);
	pause(-1,-1);
    }
}

Quick Sort is a sequential algorithm, with an average case time of O(n log n).
快速排序的基本思想是基于分治策略的。对于输入的子序列L[p..r],如果规模足够小则直接进行排序,否则分三步处理:
1,分解(Divide):将输入的序列L[p..r]划分成两个非空子序列L[p..q]和L[q+1..r],使L[p..q]中任一元素的值不大于L[q+1..r]中任一元素的值。
2,递归求解(Conquer):通过递归调用快速排序算法分别对L[p..q]和L[q+1..r]进行排序。
3,合并(Merge):由于对分解出的两个子序列的排序是就地进行的,所以在L[p..q]和L[q+1..r]都排好序后不需要执行任何计算L[p..r]就已排好序。
这个解决流程是符合分治法的基本步骤的。因此,快速排序法是分治法的经典应用实例之一。
以上解释来自http://algorithm.diy.myrice.com/algorithm/commonalg/sort/internal_sorting/quick_sort/quick_sort.htm

Odd-Even Transposition Sort
/*
 * @(#)OETransSortAlgorithm.java	95/11/22 Andrew Kitchen
 *
 */

/**
 * An Odd-Even Transposition sort demonstration algorithm
 *
 * @author Andrew Kitchen
 * @version 	22 Nov 1995
 */
class OETransSortAlgorithm extends SortAlgorithm {
    void sort(int a[]) throws Exception {
	pause(0,a.length-1);
	for (int i = 0; i < a.length/2; i++ ) {
		if (stopRequested) {
		    return;
		}
		for (int j = 0; j+1 < a.length; j += 2) 
		    if (a[j] > a[j+1]) {
		        int T = a[j];
		        a[j] = a[j+1];
		        a[j+1] = T;
		    }
		pause(); pause();
		for (int j = 1; j+1 < a.length; j += 2) 
		    if (a[j] > a[j+1]) {
		        int T = a[j];
		        a[j] = a[j+1];
		        a[j+1] = T;
		    }
		pause(); pause();
	}	
	pause(-1,-1);
    }
}

Odd-Even Transposition Sort is a parallel algorithm, with an worst case time of O(n), running on n processors. Its absolute speed up
is O(log n), so its efficiency is O((log n)/n).
主要思想为奇偶位两个循环并行排序。

Shear Sort
/**
 * A shear sort demonstration algorithm
 * SortAlgorithm.java, Thu Nov 27 1995
 *
 * author Andrew Kitchen
 */

class ShearSortAlgorithm extends SortAlgorithm {
    private int Log, Rows, Cols;

    void sort(int a[]) throws Exception {
	int pow=1, div=1;
	int h[];

	for(int i=1; i*i<=a.length; i++) 
	    if (a.length % i == 0) div = i;
	Rows = div; Cols = a.length / div;
	for(Log=0; pow<=Rows; Log++) 
	    pow = pow * 2;

	h = new int[Rows];
	for (int i=0; i<Rows; i++)
	    h[i]=i*Cols;

	for (int k=0; k<Log; k++) {
	    for (int j=0; j<Cols/2; j++) {
		for (int i=0; i<Rows; i++)
	            sortPart1(a,i*Cols,(i+1)*Cols,1,(i%2==0?true:false));
		apause(h);
		for (int i=0; i<Rows; i++)
	            sortPart2(a,i*Cols,(i+1)*Cols,1,(i%2==0?true:false));
		apause(h);
	    }
	    for (int j=0; j<Rows/2; j++) {
		for (int i=0; i<Cols; i++)
	            sortPart1(a,i,Rows*Cols+i,Cols,true);
		apause(h);
		for (int i=0; i<Cols; i++)
	            sortPart2(a,i,Rows*Cols+i,Cols,true);
	        apause(h);
	    }
	}
	for (int j=0; j<Cols/2; j++) {
	    for (int i=0; i<Rows; i++)
	        sortPart1(a,i*Cols,(i+1)*Cols,1,true);
	    apause(h);
	    for (int i=0; i<Rows; i++)
	        sortPart2(a,i*Cols,(i+1)*Cols,1,true);
	    apause(h);
	}
	for (int i=0; i<Rows; i++)
	    h[i]=-1;
	apause(h);
    }

    private void sortPart1(int a[], int Lo, int Hi, int Nx, boolean Up) throws Exception {
	    for (int j = Lo; j+Nx<Hi; j+=2*Nx) 
		if ((Up && a[j] > a[j+Nx]) || !Up && a[j] < a[j+Nx]) {
		    int T = a[j];
		    a[j] = a[j+Nx];
		    a[j+Nx] = T;
		}
    }

    private void sortPart2(int a[], int Lo, int Hi, int Nx, boolean Up) throws Exception {
	    for (int j = Lo+Nx; j+Nx<Hi; j+=2*Nx) 
		if ((Up && a[j] > a[j+Nx]) || !Up && a[j] < a[j+Nx]) {
		    int T = a[j];
		    a[j] = a[j+Nx];
		    a[j+Nx] = T;
		}
    }
}

Shear Sort is a parallel algorithm, with an worst case time of O(n1/2 log n), running on n processors. Its absolute speed up is
O(n1/2), so its efficiency is O(1/n1/2).
主要思想为将N个数的数组分配到长度为sqrt(N)的grid,然后分别对行和列并行排序。
分享到:
评论

相关推荐

    十种排序算法介绍十种排序算法介绍

    #### 四、其他排序算法 除了以上三种基本的排序算法外,还有许多其他的排序算法,每种算法都有其独特的特性和适用场景。 4. **希尔排序(Shell Sort)** - **原理**: 希尔排序是对直接插入排序的一种改进方法。它...

    数据结构四种排序算法

    本项目提供了四种经典的排序算法的源程序,帮助我们深入理解它们的工作原理和性能差异。这四种排序算法分别是:快速排序、直接插入排序、简单选择排序和起泡排序。接下来,我们将逐一探讨这些排序算法。 1. **快速...

    四种算法实现排序

    这里我们将详细讨论四种常见的排序算法:冒泡排序、简单选择排序、归并排序和堆排序,以及它们在C#语言中的实现。 1. **冒泡排序**: 冒泡排序是一种简单的交换排序,它通过不断比较相邻元素并交换位置来逐步排序...

    7种排序算法的效率比较

    算法课的一个小项目,语言python。代码实习7种排序算法,TK实现简单GUI,源码可以学习7中排序算法详细实现,和GUI的搭建,基本包含了常用GUI组件。

    Java 七种排序算法实现

    在编程领域,排序算法是数据结构与算法学习中的基础部分,尤其在Java中,掌握不同的排序算法对于优化程序性能至关重要。本资源包含了七种经典的排序算法实现,它们分别是冒泡排序、插入排序、递归排序(这里可能是指...

    3种排序算法可视化程序 c++ 算法

    总结,这个C++项目提供了一种直观的学习和教学方式,通过可视化来探索和理解三种基本排序算法。对于初学者来说,这是一个很好的起点,可以深入理解排序算法的运作机制。同时,对于经验丰富的程序员,这也可以作为一...

    四种排序算法——数据结构实验

    本实验将介绍四种常见的排序算法:插入排序、折半排序、快速排序和冒泡排序,这些算法都是用C语言实现的,并且提供了可执行文件供用户实践和学习。 首先,我们来看插入排序。插入排序是一种简单直观的排序算法,它...

    七种经典排序算法[代码+详细注释+性能测试]

    本文将深入探讨七种经典排序算法,包括它们的工作原理、代码实现、性能测试以及适用场景。** 1. **冒泡排序(Bubble Sort)** 冒泡排序是最基础的排序算法之一,通过不断交换相邻的逆序元素来逐步排序。它的时间...

    8种排序算法(选择排序 冒泡排序 快速排序等~)

    在计算机科学中,排序算法是用于对一组数据进行排列的算法。这里有8种常见的排序算法,包括选择排序、冒泡排序和快速...在学习和实践中,结合具体需求灵活运用这些排序算法,能够帮助我们编写出更高效、更优化的代码。

    python常用排序算法汇总

    该程序包含7大排序算法: # sort.bubbleSort() #冒泡排序 # sort.shellSort() #希尔排序 ...该排序算法把每次的排序结果都列出来,可供初学者学习。 self.arr存放的是待排序列表,可改成自己的数据

    数据结构中的八种排序算法

    在计算机科学领域,排序算法是数据结构学习的重要组成部分。这些算法用于组织和整理一组数据,使其按照特定顺序排列。在给定的标题“数据结构中的八种排序算法”和描述中,提到了八种经典的排序算法,它们在严蔚敏...

    数据结构学习笔记排序算法:基数排序

    数据结构学习笔记排序算法:基数排序数据结构学习笔记排序算法:基数排序数据结构学习笔记排序算法:基数排序数据结构学习笔记排序算法:基数排序数据结构学习笔记排序算法:基数排序数据结构学习笔记排序算法:基数...

    三十种排序算法的可视化

    总的来说,这个“三十种排序算法的可视化”项目是一个极好的学习资源,它将理论知识与实践结合,使得学习者能够生动、直观地掌握排序算法的核心概念和运作机制,对于提升编程技能和理解复杂算法有着极大的帮助。

    五种排序算法

    在本文中,我们将探讨几种在C++中最常见的排序算法。这五种算法分别是桶排序、快速排序、归并排序、插入排序和qsort函数。每种算法都有其适用场景、优缺点、时间复杂度和空间复杂度。理解这些算法对于提升编程技能和...

    从零开始学算法:十种排序算法介绍

    在这篇文章中,我们将探讨三种基础排序算法:选择排序、插入排序和冒泡排序。 1. **选择排序(Selection Sort)** - 选择排序的工作原理是,每次从未排序的元素中找到最小(或最大)的元素,放到已排序部分的末尾。...

    算法设计常用四种排序

    本文将详细介绍四种常见的排序算法:选择排序、起泡排序、归并排序和快速排序,并给出对应的伪代码及简要分析。 #### 一、选择排序 **概述:** 选择排序的基本思想是从待排序的数据元素中选出最小(或最大)的一个...

    7种基本排序算法

    理解并掌握这些排序算法的原理和实现,对于编程学习者来说,不仅能够提高编程能力,也能培养解决问题的逻辑思维。在实际应用中,根据数据规模、内存限制和性能需求,可以选择合适的排序算法来优化程序。

    用java语言写的四种排序算法

    在这个“用java语言写的四种排序算法”的压缩包中,我们可以期待看到Java如何实现这些算法,以及封装和打包的应用。 1. **冒泡排序(Bubble Sort)**: 冒泡排序是一种简单的交换排序,通过不断比较相邻元素并交换...

    快速排序算法和冒泡排序效率对比

    快速排序和冒泡排序是两种常见的排序算法,它们在计算机科学中扮演着重要的角色,特别是在数据处理和优化程序性能方面。...同时,这也为我们提供了深入学习其他高级排序算法,如归并排序、堆排序等的基础。

Global site tag (gtag.js) - Google Analytics