zoukankan      html  css  js  c++  java
  • 数据结构和算法之排序算法

    插入排序的基本思想

    每次将一个待排序的数据元素,按照其关键字大小插入到前面已经排好序的有序的适当位置,使插入以后的数据序列仍然为一个有序数列,直到整个序列称为有序序列为止。

    直接插入排序(把待排序元素分成两部分,一部分是没排好序的元素,另一部分是排好序的元素。把没排好序的元素逐一插入以排好序的部分)

    折半插入排序(向有序序列中插入元素,插入位置可以不断地平分有序序列,并把待插入的元素的关键字与平分有序序列得到的关键字比较,以确定下一步要评分的序列,直到找到合适的插入位置为之。)

    希尔排序(先将整个待排序序列分割成若干子序列,每个子序列由相差一定长度的数据元素组成【这个相差的长度称为增量】)

     1 /**直接插入排序算法
     2      * @param obj
     3      * @return
     4      */
     5     public static int[] SelectSort(int[] obj) {
     6         //外层循环决定要遍历数组几轮
     7         for (int i = 1; i < obj.length; i++) {
     8             int value = obj[i];
     9             int temp = i;
    10             //内层循环决定一轮中的要对比的次数
    11             while (temp > 0 && value < obj[temp - 1]) {
    12                 obj[temp] = obj[temp - 1];
    13                 obj[temp-1]=value;
    14                 temp--;
    15             }
    16             
    17         }
    18         return obj;
    19     }
    直接插入排序算法
     1     /**折半插入排序
     2      * 
     3      * @param obj
     4      * @return
     5      */
     6     public static int[] halfSort(int[] obj){
     7         int len=obj.length;//获取数组的长度
     8         int value=obj[len-1];//待插入元素
     9         int min=0;
    10         int max=len-2;
    11         while (min<=max) {
    12             int middle=(min+max)/2;//获取数组中间元素的下标
    13             if (obj[middle]>value) 
    14                 max=middle-1;    
    15             else
    16                 min=middle+1;
    17         }
    18         for (int i = len-1; i >max+1; i--) {//元素向右移动
    19             obj[i]=obj[i-1];
    20         }
    21         obj[max=1]=value;
    22         return obj;            
    23     }
    24     
    折半插入排序
     1     /**希尔排序
     2      * @param obj
     3      */
     4     public static void shellSort(int[] obj){
     5         int temp ;//零时变量
     6         int len=obj.length/2;//分割集合的间隔长度,初始值为数组长度的一半
     7         int pointer; //进行比较的下标位置
     8         //1按每次减半划分步长,直到步长为0(设置步长增量)
     9         while (len!=0) {
    10             //2对各个集合进行比较(根据步长,设置每轮循环次数)
    11             for (int i = len; i <obj.length; i++) {
    12                 pointer=i-len; //计算要和当前值进行比较的位置
    13                 temp=obj[i];
    14                 //3.将临时变量与集合内的数进行比较
    15                 //按照步长距离,将临时变量里的值和集合内数值一次进行比较
    16                 while (temp<obj[pointer]) {
    17                     obj[pointer+len]=obj[pointer];
    18                     pointer=pointer-len;//计算下一个欲进行比较的位置
    19                     //如果当前下表为值大于或等于当前步长则继续循环,
    20                     //按步长与墙面个所有数进行比较
    21                     //直到遇到比当前临时变量小得数为止
    22                     if (pointer<0) {
    23                         break;
    24                     }
    25                 }
    26                 //把临时变量赋值到当前下标所在位置
    27                 obj[pointer+len]=temp;
    28             }
    29             len=len/2; //计算下次分割的间隔的步长
    30         }
    希尔排序

    交换排序

    冒泡排序(比较相邻的两个数据元素的关键字,如果他们之间的大小关系与期望的关系相反,则交换两个元素的位置,否则不交换。)

    快速排序

     完全图是每对顶点之间都恰好有一条边的简单图

  • 相关阅读:
    序列操作
    上帝造题的七分钟2 / 花神游历各国
    火柴排队
    pair(对组)用法
    线段树
    链上分治
    Rem与Px的转换
    css中单位px和em,rem的区别
    css网页自适应-1
    css网页自适应-2
  • 原文地址:https://www.cnblogs.com/wanghongjie/p/4798605.html
Copyright © 2011-2022 走看看