没有合适的资源?快使用搜索试试~ 我知道了~
排序算法(二)希尔排序+归并排序+快速排序+堆排序–O(nlogn)的排序
4 下载量 154 浏览量
2021-01-21
16:57:54
上传
评论 1
收藏 256KB PDF 举报
温馨提示
文章目录希尔排序归并排序快速排序(20世纪对世界影响最大的算法之一)牛掰!堆排序 希尔排序 排序思想:希尔排序可以说是插入排序的一种变种。无论是插入排序还是冒泡排序,如果数组的最大值刚好是在第一位,要将它挪到正确的位置就需要 n – 1 次移动。当原数组的一个元素如果距离它正确的位置很远的话,需要与相邻元素交换多次才能到达正确的位置,这样效率较低。希尔排序就是插入排序排序的一种简单改进,交换不相邻的元素以对数组的局部进行排序,以此来提升效率。 排序过程: 先让数组中任意间隔为 h 的元素有序,刚开始 h 的大小可以是 h = n / 2 接着让 h = n / 4,让 h 一直缩小,相当于不断
资源推荐
资源详情
资源评论
排序算法(二)希尔排序排序算法(二)希尔排序+归并排序归并排序+快速排序快速排序+堆排序堆排序–O(nlogn)的的
排序排序
文章目录文章目录希尔排序归并排序快速排序(20世纪对世界影响最大的算法之一)牛掰!堆排序
希尔排序希尔排序
排序思想:希尔排序可以说是插入排序的一种变种插入排序的一种变种。无论是插入排序还是冒泡排序,如果数组的最大值刚好是在第一位,要将它挪到正
确的位置就需要 n – 1 次移动。当原数组的一个元素如果距离它正确的位置很远的话,需要与相邻元素交换多次才能到达正确的位置,
这样效率较低。希尔排序就是插入排序排序的一种简单改进,交换不相邻的元素以对数组的局部进行排序,以此来提升效率。
排序过程:
先让数组中任意间隔为 h 的元素有序,刚开始 h 的大小可以是 h = n / 2
接着让 h = n / 4,让 h 一直缩小,相当于不断增大步长,当 h = 1 时,也就是此时数组中任意间隔为1的元素有序,此时的数组就是有
序的了。
package sorting;
import java.util.Scanner;
/**
* @ClassName HillSort.java
* @Description 希尔排序
* @Author ZBW
* @Date 2020年03月07日 19:20
**/
public class HillSort {
public static int[] sort(int array[]) {
if (array == null || array.length 0; h /= 2) {
//对各个局部分组进行插入排序
for (int i = h; i 0 && temp < array[k]; k -= h) {
array[k + h] = array[k];
}
array[k + h] = temp;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("请输入待排序数据个数:");
//输入需要排序的数据个数
int n = in.nextInt();
int[] array = new int[n];
System.out.println("请输入待排序数据:");
for (int i = 0; i < n; i++) {
array[i] = in.nextInt();
}
int[] res = sort(array);
print(res);
}
public static void print(int[] array) {
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
}
}
时间复杂度为O(nlogn),空间复杂度:O(1)
属于非稳定排序
属于原地排序
归并排序归并排序
排序思想:将一个大的无序数组有序,我们可以把大的数组分成两个,然后对这两个数组分别进行排序,之后在把这两个数组合并成一
个有序的数组。由于两个小的数组都是有序的,所以在合并的时候是很快的。
注意:在一个归并排序中,可以将总的数组中n个元素分成logn个层次个层次,每个层次的合并保持在O(n)的复杂度,那么最后的算法时间复的复杂度,那么最后的算法时间复
杂度为杂度为O(nlogn)
排序过程:
通过递归的方式将大的数组一直分割,直到数组的大小为 1,此时只有一个元素,那么该数组就是有序的了
再把两个数组大小为1的合并成一个大小为2的,再把两个大小为2的合并成4的 …
直到全部小的数组合并起来。
package sorting;
import java.util.Scanner;
/**
* @ClassName MergeSort.java
* @Description 归并排序递归版本
* @Author ZBW
* @Date 2020年03月07日 22:18
**/
public class MergeSort {
private static int[] sort(int[] array) {
merge(array, 0, array.length - 1);
return array;
}
//递归使用归并排序,对array[l...r]的范围进行排序
private static void merge(int[] array, int l, int r){
if (l >= r) {
return;
}
int mid = (l + r)/2;
merge(array, l, mid);
merge(array, mid + 1, r);
//此处是一种优化,对于整体数组基本有序时的优化
if (array[mid] > array[mid+1]) {
mergeAll(array, l, mid, r);
}
}
//将array[l...mid]和array[mid+1...r]两部分进行归并
private static void mergeAll(int[] array, int l, int mid, int r) {
int[] temp = new int[r-l+1];
for (int i = l; i <= r; i++) {
temp[i-l] = array[i];
}
int i = l, j = mid+1;
for (int k = l; k mid) {
array[k] = temp[j-l];
j++;
} else if (j > r) {
array[k] = temp[i-l];
i++;
} else if (temp[i-l] < temp[j-l]) {
array[k] = temp[i-l];
i++;
} else {
array[k] = temp[j-l];
j++;
}
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("请输入待排序数据个数:");
//输入需要排序的数据个数
int n = in.nextInt();
int[] array = new int[n];
System.out.println("请输入待排序数据:");
for (int i = 0; i < n; i++) {
array[i] = in.nextInt();
}
int[] res = sort(array);
print(res);
}
public static void print(int[] array) {
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
}
}
分析上面的sort()函数,时间复杂度为O(nlogn),空间复杂度为O(n)
属于稳定排序稳定排序
属于非原地排序非原地排序
剩余6页未读,继续阅读
资源评论
weixin_38713167
- 粉丝: 6
- 资源: 938
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功