排序算法(二)

1.插入排序—直接插入排序(Straight Insertion Sort)

基本思想:

    将一个记录插入到已经排序好的有序表中,从而得到一个新、记录数增1的有序表。即:先将序列的第一个记录看成是一个有序的子序列,然后从第二个记录逐个进行插入,直至整个序列有序为止。

    要点:设立哨兵,作为临时存储和判断数组边界之用。

直接插入排序示例:

如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。

算法的实现:

      

package sort;

public class InsertSort {

    public static void main(String[] args) {

        int a[] = {12,42,32,23,56,35,76,36,2};

        InsertSort.sort(a,8);

        for(int i=0;i<a.length; i++){
            System.out.print(a[i]+" ");
        }
    }

    public static void sort(int[] arr, int n){
        for(int i=1; i<n; i++){
            if(arr[i] < arr[i-1]){        //若第i个元素大于大于i-1个元素,直接插入。否则,进入有序表,判断插入位置之后插入

                int j = i-1;    //已经是排序号数组的长度
                int x = arr[i];    //设立哨兵,存储带排序的元素

                arr[i] = arr[i-1];     //向后移一位

                while(x < arr[j]){
                    arr[j+1] = arr[j];     //向后移一位
                    j--;
                }
                arr[j+1] = x;    //插入到正确的位置
            }
        }
    }
}

效率:

  时间复杂度:O(n²)

  其他的插入排序有二分插入排序,2-路插入排序。

时间: 2024-11-29 10:06:22

排序算法(二)的相关文章

基本排序算法&lt;二&gt;

希尔排序 原理:希尔排序也称之为递减增量排序,它是对插入排序的改进.在插入排序中,我们知道,插入排序对于近似已排好序的序列来说,效率很高,可以达到线性排序的效率.但是插入排序效率也是比较低的,他一次只能将数据向前移一位.比如如果一个长度为N的序列,最小的元素如果恰巧在末尾,那么使用插入排序仍需一步一步的向前移动和比较,要N-1次比较和交换.希尔排序通过将待比较的元素划分为几个区域来提升插入排序的效率.这样可以让元素可以一次性的朝最终位置迈进一大步,然后算法再取越来越小的步长进行排序,最后一步就是

排序算法(二)之希尔排序

希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一.本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现. 基本思想 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止. 简单插入排序很循规蹈矩,不管数组分布是怎么样的,依然

图解排序算法(二)之希尔排序

希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一.本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现. 基本思想 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止. 简单插入排序很循规蹈矩,不管数组分布是怎么样的,依然

常用排序算法二

SELECTION SORT:选择排序算法,每次从未完成排序的部分选出最小的插入未完成排序元素的最前面 代码实现比较好写: import java.util.*; public class SelectSort {     public static void main(String[] args)      {         System.out.println("Hello World!"); int [] a = {3,44,38,5,47,15,36,26,27,2,46,4

[排序算法二]选择排序

选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾.以此类推,直到全部待排序的数据元素的个数为零.选择排序是不稳定的排序方法. 算法性能 时间复杂度:O(n^2),总循环次数 n(n-1)/2.数据交换次数 O(n),这点上来说比冒泡排序要好,因为冒泡是把数据一位一位的移上来,而选择排序只需要在子循环结束后移动一次

排序算法二:归并排序(Merge sort)

归并排序(Merge sort)用到了分治思想,即分-治-合三步,算法平均时间复杂度是o(nlgn). (一)算法实现 1 private void merge_sort(int[] array, int first, int last) { 2 if (first + 1 < last) { 3 int mid = (first + last) / 2; 4 merge_sort(array, first, mid); 5 merge_sort(array, mid, last); 6 7 /

排序算法(二)

希尔排序(不稳定) 算法思想:(以从小到大为例) 希尔排序使用了一个 h1,h2,h3,--,ht 的增量序列.用增量 Hk 对数据元素的一趟排序下来,所有相隔 Hk 的元素都已经被排好序,即:对于任意位置 i,A[i]<=A[i+hk]恒成立.待使用增量为1的那一趟排序之后,所有的元素都保持有序状态. 核心代码 //此处增量序列取:1,3,5 int hk; for(hk=5;hk>0;hk/=2){     for(i=hk;i<=N;i++){       int tmp=A[i]

Java排序算法(二):简单选择排序

[基本思想] 在要排序的一组数中.选出最小的一个数与第一个位置的数交换:然后在剩下的数中再找出最小的与第二个位置的数交换,如此循环至倒数第二个数和最后一个数比較为止. 算法关键:找到最小的那个数.并用变量记住它的下标. [java实现] public class SimpleSelectionSort { public static void main(String[] args) { int[] arr = { 9, 1, 5, 8, 3, 7, 4, 6, 2 }; System.out.p

(高效率排序算法二)快速排序

快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 假设用户输入了如下数组: 下标 0 1 2 3 4 5 数据 6 2 7 3 8 9 创建变量i=0(指向第一个数据), j=5(指向最后一个数据), k=6(赋值为第一

排序算法二:二分插入排序

一.算法思想 1.二分插入排序的基本思想和插入排序一致:都是将某个元素插入到已经有序的序列的正确的位置: 2.和直接插入排序的最大区别是,元素A[i]的位置的方法不一样:直接插入排序是从A[i-1]往前一个个比较,从而找到正确的位置:而二分插入排序,利用前i-1个元素已经是有序的特点结合二分查找的特点,找到正确的位置,从而将A[i]插入,并保持新的序列依旧有序: 3.时间复杂度: T(n) = O(n); 二.代码 1 class BinaryInsertSort{ 2 public stati