当遇到有数组需要进行排序的时候,除了冒泡排序,已经字典数组常规排序以外,还有以下希尔排序方法,做一下记录,方便以后再用;
/// <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);