一头扎进算法导论-插入排序

梦里梦外; 2022-07-16 08:27 238阅读 0赞

定义:直接插入排序是一种简单的排序方法,她的基本思想是依次将每个记录插入到一个已排好序的有序表中去,从而得到一个新的、记录数增加1的有序表,就好比斗地主抓牌排序的这么一个过程

过程:
这里写图片描述

用自己的话说
用一个索引key表示当前捉到的牌,如图中红框所示。
用一个索引i表示已经排序好的牌(从key牌左边开始轮询),如图中黑框所示意。
从索引2开始捉牌,每次捉牌时进行三个步骤

  • 1.记录key的牌的值
  • 2.轮询排序好的牌,如果排序好的牌比当前牌大,则左移
  • 3.将当前牌插入排序好的牌中

代码实现

  1. public int[] sort(int[] a){
  2. for(int key=1;key<a.length;key++){
  3. //这里做一个大循环
  4. int keyValue = a[key];//记录当前数
  5. int i = key-1;//记录当前牌左边第一个坐标
  6. while(i>-1&&a[i]<keyValue){
  7. //当坐标未到尽头且选取到的数大于当前数
  8. a[i+1]=a[i];//置换
  9. --i;//下一个数
  10. }
  11. a[i+1]=keyValue;//插入当前数
  12. }
  13. return a;
  14. }

测试

  1. public static void main(String[] args){
  2. int[] a= new int[]{
  3. 5,8,3,4,7,2,7,4,6,8,2,5,8,9,0,3,2,7,4,6,3,1};
  4. a = new Insertion().sort(a);
  5. for(int i : a){
  6. System.out.print(i+",");
  7. }
  8. }

结果

  1. 9,8,8,8,7,7,7,6,6,5,5,4,4,4,3,3,3,2,2,2,1,0,

这里写图片描述

—————-2016-10-16 用递归完成子序列排序——————–
这里写图片描述

  1. public int[] sortByRecursion(int[] a){
  2. for(int k=1;k<a.length;k++){
  3. int value = a[k];
  4. int i = k-1;//左边第一个数坐标
  5. int j = sortChild(a,value,i);
  6. a[++j] = value;
  7. }
  8. return a;
  9. }
  10. /** * jiangjintai * 2016年10月16日 * @param a * @param value * @param i */
  11. private int sortChild(int[] a, int value, int i) {
  12. if(i>-1&&a[i]>value){
  13. //临界条件
  14. a[i+1]=a[i--];//置换
  15. return sortChild(a, value, i);
  16. }else{
  17. return i;
  18. }
  19. }

发表评论

表情:
评论列表 (有 0 条评论,238人围观)

还没有评论,来说两句吧...

相关阅读

    相关 一头算法导论-冒泡排序

    定义:交换排序的基本思想是,通过比较两个记录键值的大小,如果这两个记录键值的大小出现逆序,则交换这两个记录,这样将键值较小的记录向序列前部移动,键值较大的记录向序列后部移动。假

    相关 一头算法导论-插入排序

    定义:直接插入排序是一种简单的排序方法,她的基本思想是依次将每个记录插入到一个已排好序的有序表中去,从而得到一个新的、记录数增加1的有序表,就好比斗地主抓牌排序的这么一个过程