- 浏览: 406005 次
- 性别:
- 来自: 天津
文章分类
最新评论
-
junchao_qin:
[img][flash=200,200][url][img]引 ...
MyEclipse中使用VSS插件 -
tigerwood008:
IE11不好用!!
js弹出窗口 + 获取上传文件全路径 -
TheMatrix:
$.ajaxSetup({async : false});这种 ...
jquery 中的post和get方法如何同步 -
多多成长记:
Blazeds与java通信 -
ZED.CWT:
[align=ceiinter][/align]
java中利用JFrame创建窗体 【转】
参考:http://student.zjzk.cn/course_ware/data_structure/web/paixu/paixu8.3.2.2.htm
http://www.stuhack.com/biancheng/c/39543.html
http://blog.csdn.net/agwujiang/article/details/5829443
冒泡排序:
package cn.edu.tju.sortArithmetic; /*冒泡排序跟选择排序,貌似没啥区别啊 * 时间复杂度:最差、平均O(n^2),最好O(n),空间复杂度1 * 稳定排序 */ public class BubbleSort { public static void bubble(int[] arr){ for(int i = arr.length - 1; i > 0; i --){ for(int j = 0; j < i; j ++){ if(arr[i] < arr[j]){ Util.swap(arr, i, j); } } } } }
选择排序:
package cn.edu.tju.sortArithmetic; /* * 基本思想:首先在未排序的序列中找到最小元素,放到序列起始位置。 * 然后从剩下的未排序的元素中继续寻找最小元素,放到已排好的序列末尾 * * 选择排序跟冒泡排序,貌似没啥区别啊 * 时间复杂度:最差、平均O(n^2),空间复杂度1 * 不稳定排序 */ public class SelectionSort { public static void selection(int[] arr){ for(int i = 0; i < arr.length; i ++){ for(int j = i + 1; j < arr.length; j ++){ if(arr[i] > arr[j]){ Util.swap(arr, i, j); } } } } }
插入排序:
package cn.edu.tju.sortArithmetic; /* * 插入排序基本思想: * 1从第一个元素开始,该元素默认已被排序 * 2取出下一个元素,在已经排序的元素序列中从后向前扫描 * 3若新元素小于原元素(已排序),则将原元素后移 * 重复3,直到找到新元素大于或等于原元素的位置,将新元素插入 * 重复2 * * 时间复杂度:最差、平均都是O(n^2),最好O(n),空间复杂度1 * 稳定排序 */ public class InsertionSort { public static void insertion(int[] arr){ for(int i = 0; i < arr.length; i ++){ for(int j = i; j > 0; j --){ if(arr[j] < arr[j - 1]){ Util.swap(arr, j, j - 1); Util.output(arr); } } } } }
希尔排序:动画演示
package cn.edu.tju.sortArithmetic; /* * 希尔排序基本思想: * /2取增量d,将i = i + d的元素作为一组,分成几组之后,在各组内进行插入排序,直到d = 1时,也即每个元素一组时,完成排序 * 如若有10个元素,则增量取为5,2,1,增量的取法不定 * 第一次排序d=5; 分组:0,5;1,6;2,7;3,8;4,9 第一组作为已排好序的初始序列,然后后面各组分别通过插入排序插入 * 第二组d=2;分组:0,2,4,6,8;1,3,5,7,9; * 第三组d=1;分组:0,1,2,3,4,5,6,7,8,9; * * 希尔排序性能优于直接插入排序 * 时间复杂度:O(nlogn),空间复杂度:1 * 不稳定排序 */ public class ShellSort { public static void shell(int[] arr){ int increment = arr.length; while((increment /= 2) > 0){ for(int i = increment; i < arr.length; i ++){ for(int j = i; j - increment >= 0; j -= increment){ if(arr[j] < arr[j - increment]){ Util.swap(arr, j, j - increment); } } } } } }
快速排序:
package cn.edu.tju.sortArithmetic; /* * 快速排序基本思想: * 1设置关键值X,一般为数组的第一个值,设定指针开始i=0,结束j=length-1 * 2数组从后往前扫描,找到第一个小于X的元素,并与X交换 * 3数组从前往后扫描,找到第一个大于X的元素,并与X交换 * 4重复2,3步,直到i >= j结束一次快速排序,此时所有大于X的数全部在X之后,小于X的数全部在X之前 * 递归此过程,对X之前的序列和X之后的序列分别进行快速排序,从而完成全部数据的快速排列 * * 时间复杂度:平均O(nlogn),最坏O(n^2),空间复杂度O(logn) * 不稳定排序 */ public class QuickSort { public static void quick(int[] arr, int left, int right) { if (left >= right) { return; } int pivotpos = partion(arr, left, right); quick(arr, left, pivotpos - 1); quick(arr, pivotpos + 1, right); } public static int partion(int[] arr, int i, int j) { int pivotpos = i;//表示关键值位置 while (i < j) { //2数组从后往前扫描,找到第一个小于X的元素,并与X交换 while (i < j && arr[j] > arr[pivotpos]) { j--; } Util.swap(arr, pivotpos, j); pivotpos = j; //3数组从前往后扫描,找到第一个大于X的元素,并与X交换 while (i < j && arr[i] < arr[pivotpos]) { i++; } Util.swap(arr, pivotpos, i); pivotpos = i; } return pivotpos; } }
归并排序:貌似有些问题。。。待解决
package cn.edu.tju.sortArithmetic; /* * 归并排序的算法思想:把待排序序列分成相同大小的两个部分,依次对这两部分进行归并排序, * 完毕之后再按照顺序进行合并。 * 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 * 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个 * 有序表,称为2-路归并。 * * 工作原理: * 1将序列每相邻的两个数字进行归并操作merge,形成floor(n/2)个序列,排序后每个序列包含两个元素 * 2将上述序列再次归并,形成floor(n/4)个序列,每个序列包含4个元素 * 3重复2,直到所有元素排序完毕 * * 时间复杂度:最差、平均和最好都是O(nlogn),空间复杂度O(n) * 稳定排序 */ public class MergeSort { public static void mergeSort(int[] arr, int left, int right){ if(left < right){ int mid = (left + right)/2; mergeSort(arr, left, mid); mergeSort(arr, mid + 1, right); merge(arr, left, mid, mid + 1, right); } } public static void merge(int[] arr, int start1, int end1, int start2, int end2){ int i = start1;//前半段指针 int j = start2;//后半段指针 int k = 0;//整个序列的指针 int[] temp = new int[end2 - start1 + 1];//建立临时数组,长度为两段序列的长度之和 while(i <= end1 && j <= end2){//依次从两个子序列中取出元素较小的放入temp System.out.println(i + ", " + j); if(arr[i] < arr[j]){ temp[k++] = arr[i++];//等价于temp[k] = arr[i]; k ++; i ++; }else{ temp[k++] = arr[j++]; } } //把剩下的元素一次放入temp,肯定只剩下一方 while(i <= end1){ temp[k++] = arr[i++]; } while(j <= end2){ temp[k++] = arr[j++]; } //System.out.println(tem) for(int m = start1; m < temp.length; m ++){ arr[m] = temp[m]; } } }
归并排序:貌似有些问题。。。待解决
package cn.edu.tju.sortArithmetic; /* * 归并排序的算法思想:把待排序序列分成相同大小的两个部分,依次对这两部分进行归并排序, * 完毕之后再按照顺序进行合并。 * 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 * 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个 * 有序表,称为2-路归并。 * * 工作原理: * 1将序列每相邻的两个数字进行归并操作merge,形成floor(n/2)个序列,排序后每个序列包含两个元素 * 2将上述序列再次归并,形成floor(n/4)个序列,每个序列包含4个元素 * 3重复2,直到所有元素排序完毕 * * 时间复杂度:最差、平均和最好都是O(nlogn),空间复杂度O(n) * 稳定排序 */ public class MergeSort { public static void mergeSort(int[] arr, int left, int right){ if(left < right){ int mid = (left + right)/2; mergeSort(arr, left, mid); mergeSort(arr, mid + 1, right); merge(arr, left, mid, mid + 1, right); } } public static void merge(int[] arr, int start1, int end1, int start2, int end2){ int i = start1;//前半段指针 int j = start2;//后半段指针 int k = 0;//整个序列的指针 int[] temp = new int[end2 - start1 + 1];//建立临时数组,长度为两段序列的长度之和 while(i <= end1 && j <= end2){//依次从两个子序列中取出元素较小的放入temp System.out.println(i + ", " + j); if(arr[i] < arr[j]){ temp[k++] = arr[i++];//等价于temp[k] = arr[i]; k ++; i ++; }else{ temp[k++] = arr[j++]; } } //把剩下的元素一次放入temp,肯定只剩下一方 while(i <= end1){ temp[k++] = arr[i++]; } while(j <= end2){ temp[k++] = arr[j++]; } //System.out.println(tem) for(int m = start1; m < temp.length; m ++){ arr[m] = temp[m]; } } }
工具类:包括交换两个元素以及输出。
package cn.edu.tju.sortArithmetic; public class Util { public static void swap(int[] arr, int i, int j){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } public static void output(int[] arr){ for(int i = 0; i < arr.length; i ++){ System.out.print(arr[i] + " "); } System.out.println(); } }
测试类:
package cn.edu.tju.sortArithmetic; public class Test { public static void main(String[] args){ int[] arr = {5, 7, 9, 3, 4, 1, 2, 6, 8, 0}; //int[] arr = {49, 38, 65, 97, 76, 13, 27}; //BubbleSort.bubble(arr); //SelectionSort.selection(arr); //InsertionSort.insertion(arr); //ShellSort.shell(arr); //QuickSort.quick(arr, 0, arr.length - 1); MergeSort.mergeSort(arr, 0, arr.length - 1); Util.output(arr); } }
- C__排序.rar (2.2 KB)
- 下载次数: 0
发表评论
-
判断二叉树是否平衡及计算二叉树深度和结点个数
2012-09-01 10:12 7727参考:http://blog.csdn.net/zz19880 ... -
【转】java实现二叉查找树
2012-08-31 09:44 1544转自:http://blog.csdn.net/zyj817 ... -
二叉树及其遍历
2012-08-21 09:50 1564转自:http://www.iteye.com/t ... -
java栈中缀表达式转为后缀表达式
2012-07-19 11:33 2470思路: 遇到数字,则输出。 遇到操作符,入栈,在入栈前若该 ... -
java栈实现括号匹配
2012-07-19 09:48 4542算法思想: 做一个空栈,读入字符。 若字符是左运算符,则入 ... -
【转】java静态变量和实例变量的区别
2012-06-20 11:02 1342转自:http://www.2cto.com/kf/20100 ... -
【转】java中会存在内存泄漏吗,请简单描述。
2012-06-20 10:24 1389java中 ... -
【转】java匿名内部类2
2012-06-12 13:45 1267匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类? ... -
【转】java匿名内部类
2012-06-12 13:32 1446java匿名内部类 (2010-11 ... -
【转】JAVA中获取路径
2012-03-25 16:57 859转自:http://wenku.baidu.com/view/ ... -
【转】Map遍历
2012-03-25 16:56 944转自:http://wenku.baidu.com/view/ ... -
【转】java解析xml文件四种方式
2012-03-25 16:54 1403转自:http://wenku.baidu.com ... -
【转】JDOM解析处理xml
2012-03-25 16:52 1263转自http://qingbyqing.iteye.com/b ... -
【转】解析Html页面:HTML Parser的试用
2012-03-24 15:10 1420转自:http://blog.csdn.net/scud/ar ... -
【转】java随机排列数组
2012-02-20 18:58 2373转自:http://blog.csdn.net/liang ... -
设计模式——代理模式
2012-01-06 13:14 1271代理模式: 为其他对象提供一种代理以控制对这个对象的访问 ... -
设计模式——装饰模式
2012-01-05 15:58 1282首先介绍三个重要原则: 依赖倒转原则:高层模块不应该依赖于 ... -
设计模式——策略模式 & 单例模式
2011-12-29 16:26 1574策略模式: * 策略模式定义了算法家族,分别封装起来,让他 ... -
设计模式——简单工厂 VS 工厂方法
2011-12-28 15:07 1210简单工厂模式: 它最大优点在于工厂类中包含了必要的逻辑 ... -
String
2011-12-27 10:53 12721. String s = new String(" ...
相关推荐
在本系统中,我们主要实现了五种常用的排序算法:冒泡排序法、快速排序法、直接插入排序法、折半插入排序法和树形选择排序法。这些算法都是在计算机科学中最基本和最重要的排序算法,广泛应用于各种数据处理和分析...
常见的经典排序算法有希尔排序、二分插入法、直接插入法、带哨兵的直接排序法、冒泡排序、选择排序、快速排序、堆排序等。 一、希尔排序(Shell 排序法) 希尔排序法,又称宿小增量排序,是 1959 年由 D.L.Shell ...
常见的排序算法有插入排序、快速排序、选择堆积排序法等。 插入排序算法是一种简单的排序算法,适用于小规模的数据结构。该算法将数据结构分成已排序部分和未排序部分,并将未排序部分的元素插入到已排序部分中。...
在计算机科学领域,排序算法是数据处理中的核心部分,它涉及到如何有效地重新排列一组数据,使其按照特定的顺序排列。本资源"总结了各种排序算法,并用C++代码实现,并有演示",提供了丰富的学习材料,包括不同类型...
希尔排序是一种基于插入排序的算法,通过将待排序的数组元素按某个增量分组,然后对每组使用直接插入排序算法排序。随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止...
本篇文章将介绍一种经典的排序算法——**合并排序法**(Merge Sort),并通过C语言实现该算法。合并排序是一种非常有效的排序方法,其核心思想是分治法:将数据分为若干个子集,对这些子集分别进行排序,最后将排序...
最快的排序算法 最快的内部排序法—桶排序法,排序算法数据结构
在IT领域,排序算法是计算机科学中的基础但至关重要的概念,尤其在数据处理和算法设计中扮演着核心角色。本文将深入探讨标题中提到的几种基于比较的排序算法:选择排序、插入排序、归并排序、快速排序、堆排序、冒泡...
最快的排序算法 最快的内部排序法—桶排序法 (1),排序算法数据结构
在计算机科学领域中,排序算法是一种基本的算法,它可以将数据按照一定的顺序排列,以便更好地存储、检索和处理数据。排序算法的速度和效率对程序的性能有着至关重要的影响。 1.冒泡排序算法 冒泡排序算法是一种...
该程序包含7大排序算法: # sort.bubbleSort() #冒泡排序 # sort.shellSort() #希尔排序 # sort.insertionSort() #插入排序 # sort.Selectionsort1() #选择排序 # sort.heapSort() #堆排序 # sort.countSort() ...
根据给定文件的信息,本文将深入探讨C语言中的两种经典排序方法:插入排序法与冒泡排序法。这两种方法在实际编程中应用广泛,对于理解数据结构与算法的基础概念至关重要。 ### 一、冒泡排序法 #### 1.1 基本原理 ...
双向起泡排序法是一种在链表结构中实现的排序算法,尤其适用于双向链表。它借鉴了传统冒泡排序的基本思想,但在链表环境中进行了优化,以提高效率。本篇文章将详细探讨双向起泡排序法及其在带头结点的双向链表中的...
六种排序算法的排序系统 本篇文章主要讲解了六种排序算法的排序系统,包括插入排序、冒泡排序、选择排序、快速排序、堆排序和归并排序。该系统可以让用户选择六种排序算法中的任意一个,并输出结果。 插入排序 ...
在IT领域,排序算法是计算机科学中的基础但至关重要的部分,尤其在数据处理和数据分析中起着关键作用。本文将详细探讨标题所提及的几种排序算法:合并排序、插入排序、希尔排序、快速排序、冒泡排序以及桶排序,并...
在计算机科学中,排序算法是数据结构领域的重要组成部分,它涉及到如何有效地重新排列一组数据,使其按照特定的顺序排列。本资源提供了三种经典的排序算法的C语言实现:堆排序、直接插入排序和快速排序。 首先,让...
在计算机科学领域,排序算法是数据处理中至关重要的一部分,它涉及到如何有效地重新排列一组数据,使其按照特定的顺序排列。本资源提供了七大经典排序算法的实现程序,包括快速排序、冒泡排序、选择排序、归并排序、...
时间复杂度用于衡量排序算法的效率,通常以大O表示法来表示。文档中提到了几种不同排序算法的时间复杂度: - **O(n²)**:插入排序、冒泡排序和选择排序的时间复杂度均为O(n²),这意味着随着数据量的增加,这些...
排序算法是计算机科学中最基础和重要的算法之一,用于将一组数据按照特定的顺序进行排列。本文将对几种常见的内部排序算法和外部排序算法进行详细总结。 首先,排序的基本定义是:给定一个包含n个记录的序列,其...
在编程领域,排序算法是计算机科学中的重要组成部分,特别是在数据处理和算法效率分析上。本文将详细介绍C++中实现的希尔排序、快速排序、堆排序和归并排序这四种经典排序算法。 希尔排序,由Donald Shell于1959年...