数据结构和算法学习(3)-简单排序
2015-09-28 16:31
423 查看
本次学习主要内容:冒泡排序、选择排序、插入排序
2.交换两个数据项或者复制其中一项
2.前一项大于后一项则交换位置,否则无动作
3.向右移动,进行下一次比较
4.比较至最后一项后从步骤1开始重复,直到整个数组有序
因为最大的数据项总是“冒泡”到数组的顶端,故称“冒泡排序”
也就是做了N^2/2次比较
也就是时间复杂度为
O(N^2)
2.与当前数据中下标最小值交换
3.重复步骤1开始,直到整个数组有序
O(N^2)
但是无疑要比冒泡排序要快,当N值较小时,特别的交换时间级比比较时间级大得多的时候,选择排序是相当快的
2.从标志起,将右侧数据依次向左侧的有序数组中插入
3.从步骤1开始重复,直到整个数组有序
然而在每次次排序发现插入点之前平均只有一般的数据参与了比较,也就是约比较N*(N-1)/4次
复制次数大致等于比较次数,故对于随机数据而言,比冒泡排序快一倍,比选择排序略快
然而对于已经有序或者基本有序的数据而言,插入排序要好得多,由于while条件多数为假,故此之变成了外层循环的一个简单语句
所以
有序情况:O(N)
无序情况:O(N^2)
排序步骤总体思路
1.比较两个数据项2.交换两个数据项或者复制其中一项
冒泡排序
-遵循规则
1.从第二项开始,依次与前一项进行比较2.前一项大于后一项则交换位置,否则无动作
3.向右移动,进行下一次比较
4.比较至最后一项后从步骤1开始重复,直到整个数组有序
因为最大的数据项总是“冒泡”到数组的顶端,故称“冒泡排序”
-代码实现
int[] sort=new int[100]; Random r = new Random(); int temp=0; for (int i = 0; i < sort.length; i++) { sort[i]=r.nextInt(100); } for (int i = sort.length; i > 0; i--) { for (int j = 1; j < i; j++) { if (sort[j]>sort[j-1]) { continue; }else { temp=sort[j]; sort[j]=sort[j-1]; sort[j-1]=temp; } } } for (int i : sort) { System.out.print(i+" "); }由于每一次都会将当前最大的数字排至队尾,所以内层循环应当循环(数组长度-外层循环次数)次
-排序效率
数组长度为N,则进行N次排序,第i次排序比较了N-i次也就是做了N^2/2次比较
也就是时间复杂度为
O(N^2)
选择排序
-遵循规则
1.找到当前数据中最小值2.与当前数据中下标最小值交换
3.重复步骤1开始,直到整个数组有序
-代码实现
int[] sort = new int[100]; Random r = new Random(); int temp = 0; int sign = 0; for (int i = 0; i < sort.length; i++) { sort[i] = r.nextInt(100); } for (int i = 0; i < sort.length; i++) { int min = sort[i]; for (int j = i; j < sort.length; j++) { if (sort[j] < min) { min = sort[j]; sign = j; } } temp = sort[i]; sort[i] = min; sort[sign] = temp; } for (int i : sort) { System.out.print(i + " "); }
-排序效率
根据比较次数来讲,与冒泡交换无异,但是交换次数要少的多,少于数组长度,虽然时间复杂度为O(N^2)
但是无疑要比冒泡排序要快,当N值较小时,特别的交换时间级比比较时间级大得多的时候,选择排序是相当快的
插入排序
-遵循规则
1.选取一个标志,要求标志左端有序2.从标志起,将右侧数据依次向左侧的有序数组中插入
3.从步骤1开始重复,直到整个数组有序
-代码实现
int[] sort = new int[100]; Random r = new Random(); int temp = 0; for (int i = 0; i < sort.length; i++) { sort[i] = r.nextInt(100); } for (int i = 1; i < sort.length; i++) { if (sort[i - 1] > sort[i]) { temp = sort[i]; int j = i; while (j > 0 && sort[j - 1] > temp) { sort[j] = sort[j - 1]; j--; } sort[j] = temp; } } for (int i : sort) { System.out.print(i + " "); }
-排序效率
在第一次排序中最多比较一次,第二次排序中最多比较两次,依次类推,最后一次比较N-1次。故最多比较N*(N-1)/2次然而在每次次排序发现插入点之前平均只有一般的数据参与了比较,也就是约比较N*(N-1)/4次
复制次数大致等于比较次数,故对于随机数据而言,比冒泡排序快一倍,比选择排序略快
然而对于已经有序或者基本有序的数据而言,插入排序要好得多,由于while条件多数为假,故此之变成了外层循环的一个简单语句
所以
有序情况:O(N)
无序情况:O(N^2)
相关文章推荐
- 数据结构_二叉索引树_模板
- 数据结构和算法学习(2)-时间复杂度
- 数据结构和算法学习(1)-概述
- Scala2.11.7学习笔记(四)常用数据结构
- 94 数据结构和方向感言
- 数据结构实验的目的、要求和评分标准
- java中Map数据结构详解
- C数据结构学习历程(1) 顺序表
- 图的三种数据结构
- 第9章 数据结构
- 中国大学MOOC-陈越、何钦铭-数据结构 一元多项式的乘法与加法运算
- 数据结构的地位
- 数据结构的基本概念和术语
- 数据结构研究的内容即定义
- 数据结构之关于栈的“先进后出”的理…
- 【数据结构导论】线性表
- 数据结构 带头结点的单链表 操作大全 最全的链表操作(c++实现)
- 数据结构之树
- 将帅问题解读
- 数据结构 顺序表(c++实现)