zoukankan      html  css  js  c++  java
  • 【数据结构】——排序算法——1.1、直接插入排序

    插入算法非常多,不管是在内功修炼,各种笔试面试都是相当实用的。接下来,将陆续将各种排序算法进行练习:


    主要分为下面几个部分(其它后面学习补充):

    一、插入类排序:1、直接插入排序(折半插入排序);2、希尔shell排序;3、二叉树排序;

    二、交换类排序:1、冒泡排序 ;2、高速排序;

    三、选择类排序:1、简单选择; 2、堆排序;

    四、归并排序 

    五、分配排序(箱排序、基数排序)


    所需辅助空间最多:归并排序 

    所需辅助空间最少:堆排序 

    平均速度最快:高速排序 

    不稳定:高速排序,希尔排序,堆排序

    本人多使用Java——開始吧!

    首先推荐1、维基百科《排序算法》词条,图文并茂,非常形象!2、学习博文《维基百科上的算法和数据结构链接非常强大》,资料非常多,保存学习!


    【数据结构】——排序算法——1.1、直接插入排序

    一、先上维基的图:

    Insertion sort animation.gif

    图一、插入排序样例

    分类 排序算法
    数据结构 数组
    最差时间复杂度 O(n^2)
    最优时间复杂度 O(n)
    平均时间复杂度 O(n^2)
    最差空间复杂度 总共O(n) ,须要辅助空间O(1)

    二、描写叙述
    非常easy,类似打扑克牌时按从小到大排。每次派牌的人发一张,就拿上来整理一下。拿起新派的牌,第一件事,便是看牌的大小,然后从手里整理好的牌按从大到小(或者从小到大)的方向查询。当找到一个位置同一时候满足一边大于等于新牌、而另外一边小于等于新牌,那就将新牌插入这个位置。反复,最后牌就排好序了!

    三、Java程序

    public class Insertion {  
        public static void insertionSort(Comparable []data) {  
            for(int index = 1; index < data.length; index++) {  
                Comparable key = data[index];  
                int position = index;  
                //shift larger values to the right  
                while (position > 0 && data[position - 1].compareTo(key) > 0) {  
                    data[position] = data[position - 1];  
                    position--;  
                }  
                data[position] = key;  
            }     
        }  
        public static void main(String []args) {  
            Comparable []c = {4, 9, 23, 1, 45, 27, 5, 2};  
            insertionSort(c);  
            for(int i = 0; i < c.length; i++)  
                System.out.println("插入排序:" + c[i]);  
        }  
    }


    折半排序在直接插入排序的基础上做了少许改良,就是查找插入位置时不再是依照顺序逐个去查找,而是用折半式的方法不断缩小插入位置的范围。Java程序例如以下:

    public class BinaryInsertion {  
      
        public int[] binSort(int r[], int n) {  
              
            for(int i=1;i<n;i++)  
            {  
                int temp=r[i];  
                int low=0;  
                int high=i-1;  
                  
                while(low<=high)  
                {  
                    int mid=(low+high)/2;               //折半  
                    if(temp<r[mid])high=mid-1;         //插入点在低半区  
                    else low=mid+1;                      //插入点在高半区  
                }  
                  
                System.out.println("low:"+low+" high:"+high);  
                  
                for(int j=i-1;j>=high+1;j--)  
                {  
                    r[j+1]=r[j];  
                }  
                  
                r[high+1]=temp;  
            }  
              
            return r;  
        }  
      
        public static void main(String[] args) {  
            int[] test = { 844,52,13, 9, 8, 55, 97, 33, 777,87,6, 1 };  
      
            test = new BinaryInsertion().binSort(test, test.length);  
      
            for (int i : test) {  
                System.out.print(i+" ");  
            }  
        }  
    }  











  • 相关阅读:
    小结一下在函数使用的时候加括号和不加括号的区别
    总结一下
    JavaScript中操作有些DOM时关于文本节点和元素节点的问题。
    HP DL388 gen9服务器安装RHEL 6.5系统
    第一次经历黑客攻击服务器系统
    小红帽5.9 配置静态IP上网问题
    redhat linux enterprise 5 输入ifconfig无效的解决方法
    关于将一台电脑分割成2个独立运行个体的测试...(1)
    Ubuntu 小白安装血泪史
    RHL 6.0学习日记, 先记下来,以后整理。
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4509633.html
Copyright © 2011-2022 走看看