排序算法时间复杂度比较

排序算法比较

主要内容:

1)利用随机函数产生

10000个随机整数,对这些数进行多种方法

排序。

2)至少采用4种方法实现上述问题求解(可采用的方法有插入排序、希尔排序、起泡排序、快速排序、选择排序、堆排序、归并排序),并把排序后的结功能果保存在不同的文件里。

3)给出该排序算法统计每一种排序方法的性能(以运行程序所花费的时间为准进行对比),找出其中两种较快的方法。

程序的主要功能:

1.随机数在排序函数作用下进行排序 2.程序给出随机数排序所用的时间。

算法及时间复杂度

(一)各个排序是算法思想:

(1)直接插入排序:将一个记录插入到已排好的有序表中,从而得

到一个新的,记录数增加1的有序表。

(2)冒泡排序:首先将第一个记录的关键字和第二个记录的关键字

进行比较,若为逆序,则将两个记录交换,然后比较第二个记录和第三个记录的关键字。依此类推,直到第N-1和第N个记录的

关键字进行过比较为止。上述为第一趟排序,其结果使得关键字的最大纪录被安排到最后一个记录的位置上。然后进行第二趟起泡排序,对前N-1个记录进行同样操作。一共要进行N-1趟起泡排序。

(3)快速排序:通过一趟排序将待排记录分割成独立的两部分,其

中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,已达到整个序列有序。 (4)选择排序:通过N-I次关键字间的比较,从N-I+1个记录中选

出关键字最小的记录,并和第I(1

时间复杂度分析

10000个数据的时间比较:

程序源代码:

/**********************************************************************************************

package test;

public class SortArray {

private static final int Min = 1;//生成随机数最小值 private static final int Max = 10000;//生成随机数最大值 private static final int Length = 10000;//生成随机数组长度(测试的朋友建议不要超过40000,不然你要等很久,如果你电脑配置绝对高的情况下你可以再加个0试试)

public static void main(String[] args) {

System.out.println("数组长度:"+Length+", Min:"+Min+", Max:"+Max); long begin; long end;

int arr[] = getArray(Length);

begin = System.currentTimeMillis(); insertSort(arr.clone());

end = System.currentTimeMillis();

System.out.println("插入法排序法消耗时间:"+(end-begin)+"毫秒");

begin = System.currentTimeMillis(); bubbleSort(arr.clone());

end = System.currentTimeMillis();

System.out.println("冒泡发排序法消耗时间:"+(end-begin)+"毫秒");

begin = System.currentTimeMillis(); fastSort(arr.clone(),0,arr.length-1); end = System.currentTimeMillis();

System.out.println("快速排序法消耗时间:"+(end-begin)+"毫秒");

begin = System.currentTimeMillis(); choiceSort(arr.clone());

end = System.currentTimeMillis();

System.out.println("选择排序法消耗时间:"+(end-begin)+"毫

秒"); }

/**生成随机数数组 * @param length 数组长度 * @return int[] */

private static int[] getArray(int length){ if(length

for (int i = 0; i

int temp = (int)(Min+Math.random()*(Max-Min-1)); arr[i] = temp; }

return arr; }

/**快速发排序

* @param arr 需要排序的数组

* @param left 数组最小下标(一般是0)

* @param right 数组最大下标(一般是Length-1) * @return int[] */

private static int[] fastSort(int[] arr,int left,int right){ if(left

//向右找大于s的元素的索引

while(i+1 -1 && arr[--j] > s); //如果i >= j 推出循环 if(i >= j){ break; }else{

//教化i和j位置的元素 int t = arr[i]; arr[i] = arr[j]; arr[j] = t; } }

arr[left] = arr[j]; arr[j] = s;

//对左面进行递归 fastSort(arr,left,j-1); //对右面进行递归 fastSort(arr,j+1,right); }

return arr; }

/**插入法排序

* @param arr 需要排序的数组 * @return int[] */

private static int[] insertSort(int[] arr){ for(int i = 1;i

}

arr[j+1] = temp; }

return arr; }

/**冒泡发排序

* @param arr 需要排序的数组 * @return int[] */

private static int[] bubbleSort(int[] arr){ for(int i = 0;i

for(int j = 0;j arr[j+1]){ int t = arr[j]; arr[j] = arr[j+1]; arr[j+1] = t; } } }

return arr; }

/**选择法排序 * @param arr * @return */

private static int[] choiceSort(int[] arr){ for(int i = 0;i

for(int j = i + 1;j

if(arr[j]

//交换m和i两个元素的位置 if(i != m){ int t = arr[i]; arr[i] = arr[m]; arr[m] = t; } }

return arr; }

/**打印数组

* @param arr 需要打印的数组 */

private static void print(int[] arr){ if(arr==null||arr.length==0)return; for (int i = 0; i

测试结果:

11

总结:

好的算法+编程技巧+高效率=好的程序。

1、做什么都需要耐心,做设计写程序则更需要耐心。一开始的时候,好不容易写好了程序,可是等最后调试的时候发现错误很隐蔽,就很费时间了。后来我先在纸上构思出函数的功能和参数,先把各小部分编好才编主函数,考虑好接口之后才动手编,这样就比较容易成功了。

2、做任何事情我决定都应该有个总体规划。之后的工作按照规划逐步展开完成。对于一个完整的程序设计,首先需要总体规划写程序的步骤,分块写,分函数写,然后写完一部分马上纠错调试。而不是像我第一次那样,一口气写完,然后再花几倍的时间调试。一步步来,走好一步再走下一步。

3、感觉一开始设计结构写函数体现的是数据结构的思想,后面的调试则更加体现了人的综合素质,专业知识、坚定耐心、锲而不舍,真的缺一不可。

4、通过这次实验,复习了Java语言相关知识,磨练了我的意志,是我更有了自信心。

11 1

排序算法比较

主要内容:

1)利用随机函数产生

10000个随机整数,对这些数进行多种方法

排序。

2)至少采用4种方法实现上述问题求解(可采用的方法有插入排序、希尔排序、起泡排序、快速排序、选择排序、堆排序、归并排序),并把排序后的结功能果保存在不同的文件里。

3)给出该排序算法统计每一种排序方法的性能(以运行程序所花费的时间为准进行对比),找出其中两种较快的方法。

程序的主要功能:

1.随机数在排序函数作用下进行排序 2.程序给出随机数排序所用的时间。

算法及时间复杂度

(一)各个排序是算法思想:

(1)直接插入排序:将一个记录插入到已排好的有序表中,从而得

到一个新的,记录数增加1的有序表。

(2)冒泡排序:首先将第一个记录的关键字和第二个记录的关键字

进行比较,若为逆序,则将两个记录交换,然后比较第二个记录和第三个记录的关键字。依此类推,直到第N-1和第N个记录的

关键字进行过比较为止。上述为第一趟排序,其结果使得关键字的最大纪录被安排到最后一个记录的位置上。然后进行第二趟起泡排序,对前N-1个记录进行同样操作。一共要进行N-1趟起泡排序。

(3)快速排序:通过一趟排序将待排记录分割成独立的两部分,其

中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,已达到整个序列有序。 (4)选择排序:通过N-I次关键字间的比较,从N-I+1个记录中选

出关键字最小的记录,并和第I(1

时间复杂度分析

10000个数据的时间比较:

程序源代码:

/**********************************************************************************************

package test;

public class SortArray {

private static final int Min = 1;//生成随机数最小值 private static final int Max = 10000;//生成随机数最大值 private static final int Length = 10000;//生成随机数组长度(测试的朋友建议不要超过40000,不然你要等很久,如果你电脑配置绝对高的情况下你可以再加个0试试)

public static void main(String[] args) {

System.out.println("数组长度:"+Length+", Min:"+Min+", Max:"+Max); long begin; long end;

int arr[] = getArray(Length);

begin = System.currentTimeMillis(); insertSort(arr.clone());

end = System.currentTimeMillis();

System.out.println("插入法排序法消耗时间:"+(end-begin)+"毫秒");

begin = System.currentTimeMillis(); bubbleSort(arr.clone());

end = System.currentTimeMillis();

System.out.println("冒泡发排序法消耗时间:"+(end-begin)+"毫秒");

begin = System.currentTimeMillis(); fastSort(arr.clone(),0,arr.length-1); end = System.currentTimeMillis();

System.out.println("快速排序法消耗时间:"+(end-begin)+"毫秒");

begin = System.currentTimeMillis(); choiceSort(arr.clone());

end = System.currentTimeMillis();

System.out.println("选择排序法消耗时间:"+(end-begin)+"毫

秒"); }

/**生成随机数数组 * @param length 数组长度 * @return int[] */

private static int[] getArray(int length){ if(length

for (int i = 0; i

int temp = (int)(Min+Math.random()*(Max-Min-1)); arr[i] = temp; }

return arr; }

/**快速发排序

* @param arr 需要排序的数组

* @param left 数组最小下标(一般是0)

* @param right 数组最大下标(一般是Length-1) * @return int[] */

private static int[] fastSort(int[] arr,int left,int right){ if(left

//向右找大于s的元素的索引

while(i+1 -1 && arr[--j] > s); //如果i >= j 推出循环 if(i >= j){ break; }else{

//教化i和j位置的元素 int t = arr[i]; arr[i] = arr[j]; arr[j] = t; } }

arr[left] = arr[j]; arr[j] = s;

//对左面进行递归 fastSort(arr,left,j-1); //对右面进行递归 fastSort(arr,j+1,right); }

return arr; }

/**插入法排序

* @param arr 需要排序的数组 * @return int[] */

private static int[] insertSort(int[] arr){ for(int i = 1;i

}

arr[j+1] = temp; }

return arr; }

/**冒泡发排序

* @param arr 需要排序的数组 * @return int[] */

private static int[] bubbleSort(int[] arr){ for(int i = 0;i

for(int j = 0;j arr[j+1]){ int t = arr[j]; arr[j] = arr[j+1]; arr[j+1] = t; } } }

return arr; }

/**选择法排序 * @param arr * @return */

private static int[] choiceSort(int[] arr){ for(int i = 0;i

for(int j = i + 1;j

if(arr[j]

//交换m和i两个元素的位置 if(i != m){ int t = arr[i]; arr[i] = arr[m]; arr[m] = t; } }

return arr; }

/**打印数组

* @param arr 需要打印的数组 */

private static void print(int[] arr){ if(arr==null||arr.length==0)return; for (int i = 0; i

测试结果:

11

总结:

好的算法+编程技巧+高效率=好的程序。

1、做什么都需要耐心,做设计写程序则更需要耐心。一开始的时候,好不容易写好了程序,可是等最后调试的时候发现错误很隐蔽,就很费时间了。后来我先在纸上构思出函数的功能和参数,先把各小部分编好才编主函数,考虑好接口之后才动手编,这样就比较容易成功了。

2、做任何事情我决定都应该有个总体规划。之后的工作按照规划逐步展开完成。对于一个完整的程序设计,首先需要总体规划写程序的步骤,分块写,分函数写,然后写完一部分马上纠错调试。而不是像我第一次那样,一口气写完,然后再花几倍的时间调试。一步步来,走好一步再走下一步。

3、感觉一开始设计结构写函数体现的是数据结构的思想,后面的调试则更加体现了人的综合素质,专业知识、坚定耐心、锲而不舍,真的缺一不可。

4、通过这次实验,复习了Java语言相关知识,磨练了我的意志,是我更有了自信心。

11 1


相关内容

  • 冒泡排序算法的分析与改进 算法设计
  • 冒泡排序算法的分析与改进 孙伟 (安徽中医学院 医药信息工程学院 09医软一班,安徽合肥,230009) 摘 要: 冒泡排序算法有两个优点:1"编程复杂度"很低,很容易写出代码:2. 具有稳定性,这里的稳定性是指原序列中相同元素的相对顺序仍然保持到排序后的序列,但当需要排序的数据 ...

  • 数据结构中几种常见的排序算法之比较
  • 几种常见的排序算法之比较 2010-06-2014:04摘要:排序的基本概念以及其算法的种类,介绍几种常见的排序算法的算法:冒泡排的复杂度,然后以表格的形式,清晰直观的表现出它们的复杂度的不同.在研究学关键词: 一.引言 排序算法,是计算机编程中的一个常见问题.在日常的数据处理中,面对纷繁我们也许有 ...

  • 数据结构排序毕业论文
  • 内容摘要 ..................................................................................................................................... 3 关键字 ..... ...

  • 各种排序的时间复杂度
  • 排序算法 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作. 分类 在计算机科学所使用的排序算法通常被分类为: 计算的复杂度(最差.平均.和最好表现),依据串列(list)的大小(n).一般而言,好的表现是O.(n log n),且坏的行为是Ω(n2).对於一个 ...

  • 第1章数据结构与算法笔试题考点分析
  • 1算法 考试的内容: 1.1 算法的基本概念 1.算法的概念(必记) : 是指解题方案的准确而完整的描述. 分析:要用计算机实现某一任务时,先应设计出一整套解决问题的指导方案,然后具体实现.整套的指导方案称之为算法,而具体的实现称之为程序.并且在设计指导方案时,可不用过多考虑到实现程序的具体细节(即 ...

  • 各种排序算法的复杂度排序法
  • 各种排序算法的复杂度 各算法的时间复杂度 平均时间复杂度 插入排序 O(n^2) 冒泡排序 O(n^2) 选择排序 O(n^2) 快速排序 O(n log n) 堆排序 O(n log n) 归并排序 O(n log n) 基数排序 O(n) 希尔排序 O(n^1.25) 1 快速排序(QuickS ...

  • 实验四题目1
  • 数据结构实验报告 实验名称: 实验四--题目一 学生姓名: 唐文旭 班 级:2013211118 班内序号: 09 学 号: 2013210524 日 期: 2015年1月5日 1.实验要求 使用简单数组实现下面各种排序算法,并进行比较. 排序算法: 1.插入排序 2.希尔排序 3.冒泡排序 4.快 ...

  • 数据结构与算法面试总结
  • 一. 算法的基本概念 计算机解题的过程实际上是在实施某种算法,这种算法称为计算机算法. 1. 算法的基本特征:可行性,确定性,有穷性,拥有足够的情报. 2. 算法的基本要素:算法中对数据的运算和操作.算法的控制结构. 3. 算法设计的基本方法:列举法.归纳法.递推.递归.减半递推技术.回溯法. 4. ...

  • 排序时间稳定性
  • 注:前七种排序是基于关键字比较的排序算法 基数排序是基于分配/收集的排序算法 (1)就平均性能而言,快速排序是最快的排序方法(即所需时间最省),(适于原始数据杂乱无章,记录数n 较大,且对稳定性没有要求的情况)但快速排序在最坏的情况下(记录正序或基本有序.轴值没有能够很好的分割数组时,即一个子数组没 ...