美文网首页
算法_选择、插入、希尔排序

算法_选择、插入、希尔排序

作者: 左上偏右 | 来源:发表于2017-01-08 13:31 被阅读13次

时间复杂度

基本算法

1、选择排序

原理是对数组进行a进行遍历,假定a[i]是最小的,然后在与i之后的元素进行对比,如果找到比a[i]更小的,则进行位置替换。

public class SelertSort {

    public void selectSort(int[] array) {
        int min;
        int tmp = 0;
        for (int i = 0; i < array.length; i++) {
            min = array[i];
            for (int j = i; j < array.length; j++) {
                if (array[j] < min) {
                    min = array[j];//最小值
                    tmp = array[i];
                    array[i] = min;
                    array[j] = tmp;
                }
            }
        }
        for(int num:array){
            System.out.println(num);
        }
    }
    
    public static void main(String [] args){
        SelertSort selertSort = new SelertSort();
        selertSort.selectSort(new int[]{9,4,2,6,7,3,10,33,88,1,17});
    }
}

2、插入排序

下面是二分法插入,跟插入排序原理一样,不同的是在找插入元素的位置。普通的插入算法是一个当前节点进行数值比较的while循环,当遇到比插入的值大时就退出循环(从小到大排序)。之后将后面的元素进行后移,腾出位置放入要插入的元素。

2.1、二分法插入


public class BinaryInsertSort {
    public static void main(String[] args) {
        int[] a={49,38,65,97,176,213,227,49,78,34,12,164,11,18,1};
        System.out.println("排序之前:");
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i]+" ");
        }
        //二分插入排序
        sort(a);
        System.out.println();
        System.out.println("排序之后:");
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i]+" ");
        }
    }
//二分法插入
    private static void sort(int[] a) {
        for (int i = 0; i < a.length; i++) {
            int temp = a[i];
            int left = 0;
            int right = i-1;
            int mid = 0;
            //确定要插入的位置
            while(left<=right){
                //先获取中间位置
                mid = (left+right)/2;
                if(temp<a[mid]){
                    //如果值比中间值小,让right左移到中间下标-1
                    right = mid-1;
                }else{
                    //如果值比中间值大,让left右移到中间下标+1
                    left = mid+1;
                }
            }
            for (int j = i-1; j >= left; j--) {
                //以左下标为标准,在左位置前插入该数据,左及左后边全部后移
                a[j+1] = a[j];
            }
            if(left != i){
                //左位置插入该数据
                a[left] = temp;
            }
        }
    }
}

2.2、直接插入排序

public class InsertSort {
/**
* 直接插入排序
* @param args
*/
       public static void main(String[] args) {
           int[] a={49,38,65,97,76,13,27,49,78,34,12,64,1};
           System.out.println("排序之前:");
           for (int i = 0; i < a.length; i++) {
               System.out.print(a[i]+" ");
           }
           //直接插入排序
           for (int i = 1; i < a.length; i++) {
               //待插入元素
               int temp = a[i];
               int j;
               for (j = i-1; j>=0; j--) {
                   //将大于temp的往后移动一位
                   if(a[j]>temp){
                       a[j+1] = a[j];
                   }else{
                       break;
                   }
               }
               a[j+1] = temp;//插入进来
           }
           System.out.println();
           System.out.println("排序之后:");
           for (int i = 0; i < a.length; i++) {
               System.out.print(a[i]+" ");
           }
       }
}

3、希尔排序


//不稳定
public class HeerSort {

 //希尔排序   
    public static void main(String[] args) {
        int[] a={49,38,65,97,76,13,27,49,78,34,12,64,1,33,85,29};
        System.out.println("排序之前:");
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i]+" ");
        }
        //希尔排序
        System.out.println();
        int d = a.length/2;
        while(true){
            for(int i=0;i<d;i++){
                for(int j=i;j+d<a.length;j+=d){
                int temp;
                if(a[j]>a[j+d]){
                    temp=a[j];
                    a[j]=a[j+d];
                    a[j+d]=temp;
                    }
                }
            }
            if(d==1){break;}
            d--;
           }
        System.out.println();
        System.out.println("排序之后:");
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i]+" ");
        }
    }

}

相关文章

  • 排序算法

    常见的排序算法 常见的排序算法有:插入、希尔、选择、冒泡、归并、快速、堆排序。。。 插入排序 算法步骤一、从数组的...

  • 前端基础整理 | 算法基础

    排序算法 冒泡排序 选择排序 插入排序 希尔排序 归并排序 堆排序 快速排序

  • 排序算法

    排序算法 非线性时间比较类排序 交换排序 冒泡排序 快速排序 插入排序 插入排序 希尔排序 选择排序 简单选择排序...

  • 九种排序算法(重要!!)

    分类:(九种排序算法) 1、插入排序:直接插入排序、二分插入排序、希尔排序; 2、选择排序:简单选择排序、堆排序 ...

  • 面试算法知识梳理(12) - 二叉树算法第二部分

    面试算法代码知识梳理系列 面试算法知识梳理(1) - 排序算法 插入排序 希尔排序 选择排序 冒泡排序 计数排序 ...

  • 面试算法知识梳理(13) - 二叉树算法第三部分

    面试算法代码知识梳理系列 面试算法知识梳理(1) - 排序算法 插入排序 希尔排序 选择排序 冒泡排序 计数排序 ...

  • 算法

    1.常用的八个基本排序算法 -前言:希尔排序和直接插入排序属于插入排序算法,简单选择排序和堆排序属于选择排序,冒泡...

  • IOS 常用算法

    一:排序算法 排序方式有插入排序,选择排序和交换排序三种。插入排序有直接插入排序和希尔排序。选择排序有简单选择排序...

  • Python排序算法有哪几种?

    python排序算法有哪些?python中常见的排序算法有:插入排序、选择排序、冒泡排序、快速排序、归并排序、希尔...

  • 算法 ----排序算法

    1、排序算法有哪些? 插入排序: 直接插入排序、希尔排序选择排序: 简单选择排序、堆排序交换排序:冒泡排序、快速排...

网友评论

      本文标题:算法_选择、插入、希尔排序

      本文链接:https://www.haomeiwen.com/subject/jemqbttx.html