JAVA-常见排序及其运用

119 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情

src=http___i.cqdj.cc_forum_201307_27_160601dupc4j8gucap6mld.gif&refer=http___i.cqdj.gif

一、排序的概念

说明:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起 来的操作。

二、常见的排序算法

插入排序:直接插入排序、希尔排序

选择排序:选择排序、堆排序

交换排序:冒泡排序、快速排序

归并排序:归并排序

直接插入排序:

说明:直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐 个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。


案例说明: ​ 假设前面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));
	}
}

希尔排序的特性总结:

  1. 希尔排序是对直接插入排序的优化。
  2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的 了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的 对比。 比特就业课
  3. 希尔排序的时间复杂度不好计算,需要进行推导,推导出来平均时间复杂度: O(N^1.3— N^2)
  4. 稳定性:不稳定

每天分享一点点,我是爱分享的小羊!