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 }
  • 相关阅读:
    Winform中用了皮肤控件之后,报错:容量超出了最大容量 参数名:capacity
    C# 生成二维码
    T-sql语句修改数据库逻辑名、数据库名、物理名
    ASP.NET MVC中使用jQuery时的浏览器缓存问题
    关于asp.net页面缓存
    关于VS 工具箱灰色,不可用的解决方案
    Android
    如何让一个DIV水平,垂直方向都居中于浏览器?
    cookie.setPath()的用法
    CSS选择器
  • 原文地址:https://www.cnblogs.com/dreamrun/p/4366585.html
Copyright © 2011-2022 走看看