开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情
一、排序的概念
说明:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起 来的操作。
二、常见的排序算法
插入排序:直接插入排序、希尔排序
选择排序:选择排序、堆排序
交换排序:冒泡排序、快速排序
归并排序:归并排序
直接插入排序:
说明:直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐
个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。
案例说明:
假设前面n-1(其中n>=2)个数是已经排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入的第n个数的新序列也是排好顺序的。
以数组int[] numbers = {9,6,3,6,2}; 为例代码实现为:
public class insertSort {
public static void main(String[] args) {
int[] numbers = {9,6,3,6,2};
System.out.println("排序前的结果为:" + Arrays.toString(numbers));
for (int i = 1; i < numbers.length; i++) { //控制循环轮数
int temp = numbers[i]; //定义待交换元素
int j; //定义待插入的位置
for (j = i; j > 0 && temp < numbers[j - 1]; j --) {
numbers[j] = numbers[j - 1];
}
numbers[j] = temp;
System.out.println("第" + i + "轮的排序结果为:" + Arrays.toString(numbers));
}
System.out.println("排序后的结果为:" + Arrays.toString(numbers));
}
}
希尔排序:
说明:希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有
记录分成个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重
复上述分组和排序的工作。当到达=1时,所有记录在统一组内排好序。
案例说明:以{5,3,2,6,4}为例进行希尔排序
实现代码:
public class ShellSort {
public static void main(String[] args) {
int[] numbers = new int[] {1,5,2,3,6,9,4,0,1};
//实现增量的变化
for(int gap = numbers.length / 2; gap > 0; gap /= 2) {
for(int i = gap; i < numbers.length; i++) {
for(int j = i - gap; j >= 0; j -= gap) {
if(numbers[j] > numbers[j + gap]) {
int temp = numbers[j];
numbers[j] = numbers[j + gap];
numbers[j + gap] = temp;
}
}
}
}
System.out.println(Arrays.toString(numbers));
}
}
希尔排序的特性总结:
- 希尔排序是对直接插入排序的优化。
- 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的 了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的 对比。 比特就业课
- 希尔排序的时间复杂度不好计算,需要进行推导,推导出来平均时间复杂度: O(N^1.3— N^2)
- 稳定性:不稳定
每天分享一点点,我是爱分享的小羊!