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