数据结构——排序相关问题
来源:互联网 发布:西门子plc tcp端口号 编辑:程序博客网 时间:2024/06/13 23:54
对任意n个关键字排序的比较次数至少为log2(n!).
1、对任意的7个关键字进行基于比较的排序,至少要进行13次关键字之间的两两比较。
一、直接插入排序
基本思想
每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置,直到全部插入排序完为止。直接插入排序的时间复杂度为O(n^2);空间复杂度为O(1).代码实现
class SortTest{ public static void main(String[] args) { int arr[]={8,6,2,3,7,4}; sop(arr); insert_Sort(arr); } public static void insert_Sort(int arr[]) { for(int i=1;i<arr.length;i++) { int j = i-1; int key = arr[i]; //哨兵用来记住待插入的元素 while(j>=0&&arr[j]>key)//判断条件 { arr[j+1]=arr[j]; j--; } arr[j+1]=key; sop(arr); } } public static void sop(int arr[]) { for(int i=0;i<arr.length;i++) { System.out.print(arr[i]+" "); } System.out.println(" "); }}
结果:
8 6 2 3 7 4
6 8 2 3 7 4
2 6 8 3 7 4
2 3 6 8 7 4
2 3 6 7 8 4
2 3 4 6 7 8
二、折半插入排序
基本思想
1、在直接插入排序中,通过二分查找来查找待插入的位置pos
2、将pos+1到 i-1这些元素往后移动一个位置
3、将待排序的元素复制到pos
代码实现
class Search1 { public static void main(String[] args) { int arr[]={8,5,3,5,6,7}; sop(arr); binary_insert_sort(arr); sop(arr); } public static void binary_insert_sort(int arr[]) { int i,j,key; for( i=1;i<arr.length;i++) { key = arr[i]; int low = 0; int high = i-1; while(low<=high) { int mid = (low+high)/2; if(key>arr[mid]) low = mid+1; else high =mid-1; } for(j=i-1;j>high;j--) { arr[j+1]=arr[j]; } arr[j+1]=key; } } public static void sop(int arr[]) { for(int i=0;i<arr.length;i++) { System.out.print(arr[i]+" "); } System.out.print("\n"); } }
结果:
8 5 3 5 6 7
3 5 5 6 7 8
我们看其实折半插入排序的时间复杂度为O(n^2),折半插入排序仅仅是减少了比较元素的次数,约为O(nlog2n),该比较次数于待排序的初始状态无关,仅取决于表中的元素个数n;
0 0
- 数据结构——排序相关问题
- 排序相关——荷兰国旗问题
- 数据结构之二叉树——相关问题总结
- 数据结构-红黑树相关问题
- 数据结构——排序
- 数据结构——排序
- 《数据结构》——排序
- 数据结构——排序
- 数据结构—排序算法
- 数据结构—希尔排序
- 数据结构—排序总结
- 数据结构 — 归并排序
- 数据结构 — 堆排序
- 数据结构—排序
- 数据结构—排序I
- 数据结构—排序II
- 数据结构—排序III
- 数据结构—排序IV
- 【Android】几种常见广播监听器(Wifi,亮灭屏,Home键,短信)总结
- Spark Streaming的Exactly-One的事务处理和不重复输出彻底掌握
- c++作业5,数组分离,成绩,数组选择
- C 语言时间函数说明
- 弄清楚C语言中的取反和反码
- 数据结构——排序相关问题
- Winfrom项目小结----DataGridView小知识点
- g++ 编译和链接
- LINUX输入子系统详解
- 二叉树的镜像
- hadoop hdfs常用命令
- 超全局系统变量 模版中经常用到的
- 数组和链表
- matlab 常用 api(五)