您的位置:首页 > 编程语言 > C语言/C++

【插入排序】直接,折半,二路,希尔

2015-06-24 10:39 417 查看
插入排序 给出一下四种方法:

直接插入排序,折半插入排序,二路插入排序,希尔插入排序

代码实现:

[cpp] view
plaincopyprint?

#include<iostream>  

using namespace std;  

#define size 21  

  

typedef int Sqlist[size];  

  

void SInsertSort(Sqlist &L, int n)  //直接插入  

{  

    cout << "直接插入排序" << endl;  

  

    for (int i = 2; i < n; ++i)  

    {  

        if (L[i] < L[i - 1])     //判断i与i-1位置的大小  

        {  

            L[0] = L[i];            //将i位置赋值给哨兵位  

  

            int j;  

            for (j = i - 1; L[0] < L[j]; --j)  

            {  

                L[j + 1] = L[j];        //循环后移  

            }  

            L[j + 1] = L[0];  

        }  

    }  

}  

  

  

void BInsertSort(Sqlist &L, int n)  

{  

    cout << "折半插入排序" << endl;  

    for (int i = 2; i < n; ++i)  

    {  

        L[0] = L[i];  

  

        int low = 1;  

        int high = i - 1;  

        int mid = 0;  

  

        while (low <= high)  

        {  

            mid = (low + high) / 2;  
  

            if (L[0] < L[mid])  

            {  

                high = mid - 1;  

            }  

            else  

            {  

                low = mid + 1;  

            }  

        }  

  

        for (int j = i - 1; j >= high + 1; --j)  

        {  

            L[j + 1] = L[j];                //循环后移  

        }  

        L[high + 1] = L[0];  

    }  

}  

  

  

void TWInsertSort(Sqlist &L, int n)         //2—路插入排序  

{  

    cout << "二路插入排序" << endl;  

  

    Sqlist T;  

    T[0] = L[0];  

    int first;  

    int last;  

    first = last = 0;  

    for (int i = 1; i < n; ++i)  

    {  

        if (L[i] < T[first])  

        {  

            first = (first - 1 + n) % n;  

            T[first] = L[i];  

        }  

        else if (L[i] > T[last])  

        {  

            last++;  

            T[last] = L[i];  

        }  

        else  

        {  

            last++;  

            T[last] = T[last - 1];  

  

            int j = last - 1;  

            for (; L[i] < T[(j - 1 + n) % n]; j = (j - 1 + n) % n)  

            {  

                T[j] = T[(j - 1 + n) % n];  

            }  

            T[j] = L[i];  

        }  

    }  

    for (int i = 0; i < n; ++i)  

    {  

        L[i] = T[first];  

        first = (first + 1) % n;  

    }  

}  

  

  

  

  

void ShellInsert(Sqlist &L, int n, int dk)//希尔插入    

{  

    int t;  

    for (int i = dk + 1; i <= n; ++i)         //按增量变化    

    {  

        if (L[i] < L[i - dk])              //比较大小    

        {  

              

            t = L[i];  

            int j = i - dk;  

            for (; j>0 && t<L[j]; j -= dk)    

            {  

                L[j + dk] = L[j];  

            }  

            L[j + dk] = t;             //赋值    

        }  

    }  

}  

  

void ShellSort(Sqlist &L, int n, int dlta[], int t)//希尔排序    

{  

    for (int k = 0; k < t; ++k)                    //按照增量数组值重复插入排序    

    {  

        ShellInsert(L, n, dlta[k]);  

    }  

}  

  

  

void main()  

{  

    Sqlist sq = { 0, 49, 38, 65, 97, 76, 13, 27, 49 };//0为哨兵位  

      

      

    cout << "原数组为:" << endl;  

    for (int i = 1; i < 9; ++i)  

    {  

        cout << sq[i]<<' ';  

    }  

    cout << endl;  

  

  

    SInsertSort(sq,9);  

  

    for (int i = 1; i < 9; ++i)  

    {  

        cout << sq[i] << ' ';  

    }  

    cout << endl;  

  

    BInsertSort(sq, 9);  

      

    for (int i = 1; i < 9; ++i)  

    {  

        cout << sq[i] << ' ';  

    }  

    cout << endl;  

  

  

    Sqlist Sq = { 49, 38, 65, 97, 76, 13, 27, 49 };  

      

    cout << "原数组为:" << endl;  

    for (int i = 0; i < 8; ++i)  

    {  

        cout << Sq[i]<<' ';  

    }  

    cout << endl;  

      

    TWInsertSort(Sq, 8);  

  

    for (int i = 0; i < 8; ++i)  

    {  

        cout << Sq[i] << ' ';  

    }  

    cout << endl;  

  

  

  

    Sqlist sQ = { 0, 49, 38, 65, 97, 76, 13, 27, 49 };//哨兵位    

    cout << "原数组为:"<<endl;  

    for (int i = 1; i <= 8; ++i)            //打印sQ  

    {  

        cout << sQ[i] << " ";  

    }  

    cout << endl;  

  

    int dlta[] = { 5, 3, 1 };             //增量数组    

  

    ShellSort(sQ, 8, dlta, sizeof(dlta) / sizeof(int));//希尔排序  

  

    cout << "希尔排序:" << endl;  

    for (int j = 1; j <= 8; ++j)  

    {  

        cout << sQ[j] << " ";  

    }  

    cout << endl;  

}  

输出结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息