C,C++,C#對兩個長度相同數組進行排序方法(希爾排序)

當遇到有數組需要進行排序的時候,除了冒泡排序,已經字典數組常規排序以外,還有以下希爾排序方法,做一下記錄,方便以後再用;

/// <summary>
/// 希爾排序函數,升序
/// </summary>
/// <param name="r"></param>
/// <param name="t"></param>
/// <param name="length"></param>
private void shelltmp_fAsc(float[] r, float[] t, int length)
{
    float x, y;
    int d, i, j;
    d = length / 2;                                             /*取第一個步長值*/
    while (d >= 1)                                             /*步長d>=1,對每組進行直接插入排序*/
    {
        for (i = d; i < length; i++)                               /*對每組進行直接插入排序*/
        {
            x = r[i];                                         /*記錄r[i]暫存入x中*/
            y = t[i];
            j = i - d;                                          /*確定每組中的記錄r[i]前一個位置*/
            while (j >= 0 && x < r[j])                          /*在組中查找插入位置,較小數往前移*/
            {
                r[j + d] = r[j];                                /*記錄後移*/
                t[j + d] = t[j];
                j = j - d;                                      /*記錄位置前移一個步長*/
            }
            r[j + d] = x;                                       /*插入記錄*/
            t[j + d] = y;
        }
        d = d / 2;                                              /*縮小步長值*/
    }

}

/// <summary>
/// 希爾排序函數,降序
/// </summary>
/// <param name="r"></param>
/// <param name="t"></param>
/// <param name="length"></param>
private void shelltmp_fDesc(float[] r, float[] t, int length)
{
    float x, y;
    int d, i, j;
    d = length / 2;                                             /*取第一個步長值*/
    while (d >= 1)                                             /*步長d>=1,對每組進行直接插入排序*/
    {
        for (i = d; i < length; i++)                               /*對每組進行直接插入排序*/
        {
            x = r[i];                                         /*記錄r[i]暫存入x中*/
            y = t[i];
            j = i - d;                                        /*確定每組中的記錄r[i]前一個位置*/
            while (j >= 0 && x > r[j])                        /*在組中查找插入位置,較大數往前移*/
            {
                r[j + d] = r[j];                              /*記錄後移*/
                t[j + d] = t[j];
                j = j - d;                                    /*記錄位置前移一個步長*/
            }
            r[j + d] = x;                                     /*插入記錄*/
            t[j + d] = y;
        }
        d = d / 2;                                             /*縮小步長值*/
    }
}

調用調用

float[] r = new float[5] { 3.1f, 2.5f, 0.4f, 1.6f, 0.1f };
float[] t = new float[5] { 3.1f, 2.5f, 0.4f, 1.6f, 0.1f };
shelltmp_fAsc(r, t, 5);
shelltmp_fDesc(r, t, 5);

 

發佈了27 篇原創文章 · 獲贊 25 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章