zoukankan      html  css  js  c++  java
  • 经典算法回顾之插入排序

      插入排序的基本思想是:每次选择待排序的记录序列的第一个记录,按照排序值的大小将其插入到已排序的记录序列中的适当位置,直到所有记录全部排序完毕。

    直接插入排序:

      直接插入排序是一种最简单的排序方法,整个排序过程为:先将第一个记录看做一个有序记录序列,然后从第二个记录开始,依次将为排序的记录插入这个有序的记录序列中,直到整个文件中的全部记录排序完毕。

      算法代码:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 template<typename T>
     5 void DirectInsertSort(T unsorted[], int size)
     6 {
     7     for(int i=1; i < size; ++i)
     8     {
     9         if(unsorted[i] < unsorted[i-1])//大于,无需操作;小于,需后移
    10         {
    11             int j = i-1;
    12             int temp = unsorted[i];//复制为哨兵,即存储为待排序元素
    13             while(j >= 0 && temp < unsorted[j])//查找在有序表中的插入位置
    14             {
    15                 unsorted[j+1] = unsorted[j];//右移
    16                 j--;
    17             }
    18             //找到位置,将temp插入
    19             unsorted[j+1] = temp;
    20         }
    21     }
    22 }
    23 
    24 int main(int argc, char *argv[])
    25 {
    26     int data[] = {12,4,1,6,3,9,10};
    27     DirectInsertSort(data,7);
    28     for(int i=0;i<7;i++)
    29         cout << data[i] << " ";
    30     return 0;
    31 }

    希尔排序:

      Shell排序的基本思想是:将整个序列分割为若干个子序列分别进行插入排序,然后改变分组,再进行插入;增量序列可为d={n/2, n/4, n/8, … , 1}。直接插入排序其实是d=1的希尔排序。

    算法代码:

     1 #include "stdafx.h"
     2 #include <iostream>
     3 using namespace std;
     4 
     5 template<typename T>
     6 void ShellInsert(T unsorted[], int size ,int dk)
     7 {//dk为增量;与直接插入排序对比记忆
     8     for(int i = dk; i < size; ++i)
     9     {
    10         if(unsorted[i] < unsorted[i-dk])
    11         {
    12             int j = i - dk;
    13             int temp = unsorted[i];
    14             while(j >= 0 && temp < unsorted[j])
    15             {
    16                 unsorted[j+dk] = unsorted[j];
    17                 j -= dk;
    18             }
    19             unsorted[j+dk] = temp;
    20         }
    21     }
    22 }
    23 
    24 template<typename T>
    25 void ShellSort(T unsorted[], int size)
    26 {
    27     int dk = size/2;
    28     while(dk >=1)
    29     {
    30         ShellInsert(unsorted, size ,dk);
    31         dk = dk/2;
    32     }
    33 }
    34 int main(int argc, char *argv[])
    35 {
    36     int data[] = {12,4,1,6,3,9,10};
    37     ShellSort(data,7);
    38     for(int i=0;i<7;i++)
    39         cout << data[i] << " ";
    40     return 0;
    41 }
  • 相关阅读:
    Python PEP—Python增强提案
    容器技术介绍:Docker简介及安装
    Python笔记:List相关操作
    Python笔记:字符串操作
    Python笔记:属性值设置和判断变量是否存在
    mitmproxy 代理工具介绍:rewrite和map local实现
    接口测试代理工具charles mock测试
    接口测试框架Requests
    JMeter性能测试:JMeter安装及脚本录制回放
    PHP Parse error: parse error, unexpected T_OBJECT_OPERATOR
  • 原文地址:https://www.cnblogs.com/dreamrun/p/4366585.html
Copyright © 2011-2022 走看看