`
metaphy
  • 浏览: 344616 次
  • 性别: Icon_minigender_1
  • 来自: 大西洋底
社区版块
存档分类
最新评论

复习一下排序算法

阅读更多
复习了一下排序算法。当年学数据结构的时候学的是头大脑袋蒙;现在依然蒙,但不像以前蒙的那么厉害了。

package algorithm.sort;
public class Sort {
	private static int[] list = {7,3,4,1,9,2,8,5,6,0,5};
	/**
	 * 冒泡排序, O(n^2)
	 */
	private static void bubble(){
		for (int i = 0; i< list.length ; i++){
			for (int j= 0; j< list.length -i -1; j++){
				if (list[j] > list[j+1]){
					int tmp = list[j];
					list[j] = list[j+1];
					list[j+1] = tmp;
				}
			}
		}
	}
	/**
	 * 简单选择排序, O(n^2)
	 * 将要排序的对象分成两部分,一部分是已排序的,一部分是未排序的,从未排序的部分选择最小的,并放入已排序部分的最后一个
	 */
	private static void selection(){
		for (int i = 0; i< list.length; i++){
			int position = i;
			for (int j =i + 1; j< list.length; j++){
				if (list[position] > list[j]){
					position = j;
				}
			}
			int tmp = list[i];
			list[i] = list[position];
			list[position] = tmp;
		}
		
	}
	/**
	 * 直接插入排序, O(n^2)
	 * 将数据分为两部分,从后面部分依次取出数据,插入前面部分(插入后的前面这部分有序)
	 */
	private static void insertion(){
		for (int i=1; i<list.length; i++){
			int j = i -1 ;
			int tmp = list[i];
			while(list[j] > tmp){
				list[j+1] = list[j];
				j--;
				if (j<0) break;
			}
			list [j+1] = tmp ;
		}
	}
	/**
	 * 快速排序, O(n*log n)
	 * 属于一种优化冒泡排序
	 * 定义一个枢轴,使得在其之前的都小于它之后的都大于等于它,然后按这个法则在枢轴两边递归运算;枢轴一般取第一个元素
	 */
	private static void quickSort(int low, int high){
		if (low < high){
			int p = partition(low,high);
			quickSort(low, p-1);
			quickSort(p+1, high);
		}
	}
	/**
	 * 将序列划分为2个子序列,并返回枢轴元素位置;其中,枢轴元素前的元素都小于枢轴元素,后的都大于枢轴元素
	 */
	private static int partition(int low, int high){
		int pivot = list[low];
		while(low < high){
			while(low < high && list[high] >= pivot) high --;
			list[low] = list[high];
			while(low < high && list[low] <= pivot) low ++;
			list[high] = list[low];
		}
		list[low] = pivot;
		return low;
	}
	/**
	 * 希尔排序,又称“缩小增量排序”,是改进的直接插入排序方式
	 * 时间复杂度依赖于步长序列,如当步长序列为delta[k]=2^(t-k+1) - 1,时间复杂度O(n^1.5)
	 * 本例,我们选择步长序列为:{5,3,1}
	 */
	private static void shell(){
		int[] step = {5,3,1};
		for (int i:step)
			shellInsert(i);
	}
	private static void shellInsert(int deltaK){
		for (int i=deltaK; i<list.length; i++){
			if (list[i]<list[i-deltaK]){
				int tmp = list[i];
				int j = i - deltaK;
				for (;j>=0 && tmp < list[j]; j-=deltaK ){
					list[j + deltaK] = list[j];
				}
				list[j+deltaK] = tmp ;
			}
		}
	}
	
	public static void main(String[] args) {
		bubble();
//		selection();
//		insertion();
//		quickSort(0, list.length -1);
//		shell();
		for (int x:list)
			System.out.print(x+" ");
	}

}


快速排序的总体思想非常直接了当,并且实用效果也不错,下面是另一种不同的实现方式:
import java.util.Random;

public class QuickSortTest {
	private static final Random RND = new Random();
	private static final int LIST_LEN = 16;
	private int[] list = new int[LIST_LEN];
	
	public QuickSortTest(){
	}
	
	/**
	 * 生成List数组,为避免过多重复数据,使用n倍大的随机数空间
	 */
	public void initList(){
		for (int i = 0 ; i <LIST_LEN; i++ ){
			list[i] = RND.nextInt(LIST_LEN * 3);
		}
	}
	
	/**
	 * 化分list,递归处理
	 * @param low 
	 * @param high
	 */
	public void qsort(int low, int high) {
		if (low < high) {
			int p = partition (low, high);
			qsort(low, p-1);
			qsort(p+1, high);
		}
	}
	
	private int partition (int low, int high) {
		// 使用[low,high]之间的随机元素做比较的基准   low<=index<=high
		int index = low + RND.nextInt(high-low+1);
		int pivot = list[index];
		
		swap (index, high);
		for (int i = index = low; i < high; i++){
			if (list[i] <= pivot ) {
				swap (i, index++);
			}
		}
		swap (index, high);
		
		return index;
	}
	
	
	private void swap (int i, int j){
		int tmp = list[i];
		list[i] = list[j];
		list[j] = tmp;
	}
	
	/**
	 * print the list
	 */
	private void printList(String msg) {
		System.out.println(msg);
		for (int i = 0; i < list.length ; i++) {
			System.out.print(list[i]);
			System.out.print("; ");
			if (i > 0 && i % 40 == 0) {
				System.out.print("\n");
			}
		}
		System.out.print("\n");
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		QuickSortTest qst = new QuickSortTest();
		qst.initList();
		qst.printList("before sort:");
		qst.qsort(0, LIST_LEN -1);
		qst.printList("after sort:");
	}
}

某次运行的结果如下:
before sort:
23; 13; 23; 9; 33; 10; 24; 25; 45; 44; 30; 1; 20; 12; 46; 47; 
after sort:
1; 9; 10; 12; 13; 20; 23; 23; 24; 25; 30; 33; 44; 45; 46; 47; 

分享到:
评论

相关推荐

    算法复习算法复习资料

    算法复习资料是学习和提升编程技能的重要资源,涵盖了数据结构、排序、搜索、图论等多个方面。本文将深入探讨这些关键知识点,帮助你巩固和提高对算法的理解。 首先,我们来谈谈数据结构。数据结构是组织和存储数据...

    算法分析期末复习

    ### 算法分析期末复习知识点汇总 #### 一、填空题与选择题概览 根据提供的描述,填空题与选择题主要考察的是算法的基础理论知识,比如各种算法的基本概念、工作原理以及特点等。这些题型有助于学生巩固算法的基础...

    算法分析与设计 复习资料以及试卷

    在复习资料中,可能会涵盖排序(如冒泡排序、快速排序、归并排序)、搜索(如二分查找、广度优先搜索、深度优先搜索)等基础算法。 2. **时间复杂性和空间复杂性**:衡量算法效率的重要指标。时间复杂性表示算法...

    数据结构复习.zip 各种排序算法、大二上算法合集

    在这个“数据结构复习.zip”压缩包中,你可能会找到一系列关于排序算法和其他基础算法的资料,这对于复习和深入理解这些概念非常有帮助。 首先,让我们详细讨论一下数据结构。数据结构是组织和存储数据的方式,它...

    算法复习要点整理

    ### 算法复习要点整理 #### 递归:算法设计与效率分析 递归,作为算法设计中的一项核心技巧,其本质在于通过自我调用来解决问题。递归算法的效率分析,尤其是时间复杂度的计算,是理解算法性能的关键。递归算法的...

    排序算法复习大全(Java实现).doc

    排序算法复习大全(Java 实现) 本文档旨在详细介绍排序算法的各种实现方式,包括插入排序、冒泡排序、选择排序、Shell 排序和快速排序等,所有算法都使用 Java 语言实现。本文档首先引入了一个基础类 Sorter,用于...

    NOIP初赛复习13排序与算法复杂度.pdf

    ### NOIP初赛复习13排序与算法复杂度 #### 排序概念 排序是一种基本的计算机程序设计操作,主要用于对一组数据元素按照特定规则进行重新排列,使其形成有序序列。这种技术在解决多种问题时都非常有用,比如查找、...

    快速排序算法复习.md

    快速排序算法复习.md

    西电算法课程期末复习资料.zip

    课程内容如下: 八大排序的详细讲解,求解递归式的复杂度,常用的几种算法和典例,贪心有活动选择,部分背包,迪杰斯特拉等,动规的有装配线调度,最大子段和,0-1背包,最长公共子序列(LCS),最长回文子序列的...

    算法设计与分析总复习题

    复习这些知识点有助于加深对算法设计和分析的理解,掌握如何分析算法的时间复杂度,以及如何运用不同的排序算法。同时,通过设计新算法,可以培养问题解决能力和抽象思维能力,这些都是成为优秀程序员的关键技能。在...

    算法导论的复习学习资料

    这份“算法导论的复习学习资料”集合了多种复习资源,包括考前整理文档、历年试题,非常适合准备相关考试或者巩固算法基础的学生。 首先,我们来看“算法分析与设计考前整理.doc”。这份文档很可能包含了算法设计的...

    算法分析与设计复习资料

    这份"算法分析与设计复习资料"包含了该领域的重要概念、方法和技术,旨在帮助学习者准备相关的考试或深入理解算法设计的基础知识。 一、算法基础 算法是一系列解决问题的明确指令,通常用于数据处理、计算或其他...

    Java基础复习笔记11基本排序算法

    ### Java基础复习笔记11基本排序算法 #### 内容概览 本文档主要介绍了Java中的几种基本排序算法,包括冒泡排序、快速排序、选择排序、堆排序等,并通过具体的代码实例对每种排序算法进行了详细的解释。文档旨在...

    算法设计复习简答题资料

    算法设计复习简答题资料 本资源摘要信息涵盖了算法设计的基本概念、算法的复杂性、分治法、动态规划、贪心算法、回溯法、分支限界法等多个方面的知识点。 一、算法的定义和特征 算法是指解决问题的方法和过程。...

    MoreWindows白话经典算法之七大排序第2版(高清)

    排序算法是指能够将一组无序的数据按照一定的顺序(升序或降序)排列起来的一种算法。排序算法的应用非常广泛,不仅在数据处理领域有着重要作用,也是解决其他复杂问题的基础。了解和掌握经典的排序算法对于提升编程...

    排序算法动态演示

    在计算机科学领域,排序算法是数据结构中至关重要的一部分,它涉及到如何有效地重新排列一组数据,使其按照特定顺序存储。...对于编程初学者或想要复习排序算法的开发者来说,这是一个非常实用的工具。

    中科大算法设计与分析复习重点.zip

    2. **排序与搜索算法**:包括冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序等经典排序算法的原理、实现和复杂度分析。搜索算法如二分查找、哈希查找也是重点。 3. **分治策略**:如归并排序、快速排序...

Global site tag (gtag.js) - Google Analytics