- 浏览: 344747 次
- 性别:
- 来自: 大西洋底
文章分类
最新评论
-
jfztaq:
问题果然解决了,太感谢了
Chrome经常性的“喔唷,崩溃了”问题 -
saintor:
因为不是每个subclass都执行Cloneable吧。
Java Object类的方法们 -
337240552:
写的不错 这个东西晕死一堆人。
对JavaScript中原型的理解 -
liang86liang:
jkleeo 写道很深奥啊.
C/CPP只有在大学的时候听说过 ...
Windows下用Eclipse搭建C/C++开发环境 -
ahong520:
看来你也是四国军棋爱好者,啥时候切磋一下
四国军棋游戏V0.3.5(未完成)
复习了一下排序算法。当年学数据结构的时候学的是头大脑袋蒙;现在依然蒙,但不像以前蒙的那么厉害了。
快速排序的总体思想非常直接了当,并且实用效果也不错,下面是另一种不同的实现方式:
某次运行的结果如下:
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;
发表评论
-
文件分割与合并
2020-03-19 20:59 262package com.test.filestool; ... -
盒子里面另一个是红球的概率问题
2019-05-08 09:27 769问题如下:引用有三个盒子,其中一个里面是两个红球,一个里面是两 ... -
Mac OS X 下运行Java standalone 连接 Notes
2017-11-27 12:32 788Mac OS X 下运行Java standalone 连接 ... -
随机密码生成
2015-09-10 10:19 784import java.util.Random; p ... -
Java 处理mail subject
2015-06-15 21:16 1079对于mail subject 前面烦人的各种Re: 或Fw: ... -
有趣的“生命游戏”
2013-04-04 10:56 1037“生命游戏” 本世纪70年代,人们曾疯魔一种被称作“生命游戏” ... -
有趣的统计英文单词频率的例子
2013-03-02 00:22 1958统计一篇英文文档或一本小说中单词出现的次数,下面代码使用的是英 ... -
有趣的统计英文字母频率的例子
2013-03-01 01:13 1391统计的是英文版"悲惨世界",代码如下,使用 ... -
有趣的将一个十进制整数转换成二进制输出的算法
2013-02-27 00:20 1344原题是将一个十进制整数转换成二进制输出。 分析:任何数可以表 ... -
统一批量修改照片名字
2012-09-01 14:00 2928在给小宝拍的照片中,有我手机拍的,有媳妇手机拍的,还有相机拍的 ... -
关于Java的UUID
2012-08-30 18:40 8317UUID或者UNID或者UID,是一个统一唯一标识,可以用来标 ... -
关于Java中的哈希表 HashMap,Hashtable 等
2012-07-27 10:10 2790首先来了解一下基本概念 所谓哈希表(Hash Table,又 ... -
关于Java中的哈希表
2012-07-27 10:01 1关于Java中的哈希表首先 ... -
关于Java的“浅拷贝”和“深拷贝” (clone method)
2012-07-24 14:31 1299这是关于Java的clone, 一些知道的和不知道的。 1. ... -
从某网站下载MP3的例子
2012-05-29 23:14 1402从某网站下载MP3的例子。为安全起见,将网站信息匿了。 ... -
统计项目中Java文件数和Java代码行数
2010-12-25 11:51 6475其实就是使用递归遍历目录下所有文件 import jav ... -
Java循环内goto语句的替代方案
2010-12-12 23:04 3250众所周知,Java虚拟机根本没有实现goto关键字。我的一个函 ... -
Struts 2 + Spring 2 + JPA + AJAX示例
2009-09-12 21:18 2582这个例子其实就是来自Struts 2的文档,但是原例子针对的是 ... -
Java线程编程学习笔记(二)
2009-06-11 17:23 1332这里是上一篇:Java线程编程学习笔记(一) Java线程编 ... -
Java线程编程学习笔记(一)
2009-04-09 10:46 2195"Java Thread Programming&q ...
相关推荐
算法复习资料是学习和提升编程技能的重要资源,涵盖了数据结构、排序、搜索、图论等多个方面。本文将深入探讨这些关键知识点,帮助你巩固和提高对算法的理解。 首先,我们来谈谈数据结构。数据结构是组织和存储数据...
### 算法分析期末复习知识点汇总 #### 一、填空题与选择题概览 根据提供的描述,填空题与选择题主要考察的是算法的基础理论知识,比如各种算法的基本概念、工作原理以及特点等。这些题型有助于学生巩固算法的基础...
在复习资料中,可能会涵盖排序(如冒泡排序、快速排序、归并排序)、搜索(如二分查找、广度优先搜索、深度优先搜索)等基础算法。 2. **时间复杂性和空间复杂性**:衡量算法效率的重要指标。时间复杂性表示算法...
在这个“数据结构复习.zip”压缩包中,你可能会找到一系列关于排序算法和其他基础算法的资料,这对于复习和深入理解这些概念非常有帮助。 首先,让我们详细讨论一下数据结构。数据结构是组织和存储数据的方式,它...
### 算法复习要点整理 #### 递归:算法设计与效率分析 递归,作为算法设计中的一项核心技巧,其本质在于通过自我调用来解决问题。递归算法的效率分析,尤其是时间复杂度的计算,是理解算法性能的关键。递归算法的...
排序算法复习大全(Java 实现) 本文档旨在详细介绍排序算法的各种实现方式,包括插入排序、冒泡排序、选择排序、Shell 排序和快速排序等,所有算法都使用 Java 语言实现。本文档首先引入了一个基础类 Sorter,用于...
### NOIP初赛复习13排序与算法复杂度 #### 排序概念 排序是一种基本的计算机程序设计操作,主要用于对一组数据元素按照特定规则进行重新排列,使其形成有序序列。这种技术在解决多种问题时都非常有用,比如查找、...
快速排序算法复习.md
课程内容如下: 八大排序的详细讲解,求解递归式的复杂度,常用的几种算法和典例,贪心有活动选择,部分背包,迪杰斯特拉等,动规的有装配线调度,最大子段和,0-1背包,最长公共子序列(LCS),最长回文子序列的...
复习这些知识点有助于加深对算法设计和分析的理解,掌握如何分析算法的时间复杂度,以及如何运用不同的排序算法。同时,通过设计新算法,可以培养问题解决能力和抽象思维能力,这些都是成为优秀程序员的关键技能。在...
这份“算法导论的复习学习资料”集合了多种复习资源,包括考前整理文档、历年试题,非常适合准备相关考试或者巩固算法基础的学生。 首先,我们来看“算法分析与设计考前整理.doc”。这份文档很可能包含了算法设计的...
这份"算法分析与设计复习资料"包含了该领域的重要概念、方法和技术,旨在帮助学习者准备相关的考试或深入理解算法设计的基础知识。 一、算法基础 算法是一系列解决问题的明确指令,通常用于数据处理、计算或其他...
### Java基础复习笔记11基本排序算法 #### 内容概览 本文档主要介绍了Java中的几种基本排序算法,包括冒泡排序、快速排序、选择排序、堆排序等,并通过具体的代码实例对每种排序算法进行了详细的解释。文档旨在...
算法设计复习简答题资料 本资源摘要信息涵盖了算法设计的基本概念、算法的复杂性、分治法、动态规划、贪心算法、回溯法、分支限界法等多个方面的知识点。 一、算法的定义和特征 算法是指解决问题的方法和过程。...
排序算法是指能够将一组无序的数据按照一定的顺序(升序或降序)排列起来的一种算法。排序算法的应用非常广泛,不仅在数据处理领域有着重要作用,也是解决其他复杂问题的基础。了解和掌握经典的排序算法对于提升编程...
在计算机科学领域,排序算法是数据结构中至关重要的一部分,它涉及到如何有效地重新排列一组数据,使其按照特定顺序存储。...对于编程初学者或想要复习排序算法的开发者来说,这是一个非常实用的工具。
2. **排序与搜索算法**:包括冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序等经典排序算法的原理、实现和复杂度分析。搜索算法如二分查找、哈希查找也是重点。 3. **分治策略**:如归并排序、快速排序...