Shell
排序算法严格来说基于插入排序思想,又称希尔排序或缩小增量排序.
Shell
排序的算法流程为:
- 将 有 0 个元素的数组分成 n 2 \frac{n}{2} 2n 个数字序列第 1 个 数 据 和 第 ~ 2 + 1 个数据为一对 。
- 一次循环使每一个序列对排好顺序。
- 然后,再 变 为 ~ 4 个序列,再次排序。
- 不断重复上述过程,随着序列减少最后变为 1 个
#include <iostream>
#include <cstdio>
#include <ctime>
const int SIZE = 10; // 数组大小
int main()
{
void ShellSort(int *a, int len);
int array[SIZE], i;
srand(time(NULL)); // 随机种子
for (i=0;i<SIZE;i++)
{
array[i] = rand()/1000+10; // 初始化数组
}
std::cout << "排序前的数组为:" << std::endl;
for (i=0;i<SIZE;i++)
{
std::cout << array[i] << " ";
}
std::cout << std::endl;
ShellSort(array, SIZE);
std::cout << "排序后的数组为:" << std::endl;
for (i=0;i<SIZE;i++)
{
std::cout << array[i] << " ";
}
std::cout << std::endl;
}
void ShellSort(int *a, int len)
{
int i, j, h;
int r, temp;
int x = 0;
for (r=len/2;r>=1;r/=2)
{
for (i=r;i<len;i++)
{
temp = a[i];
j = i - r;
while(j>=0 && temp<a[j])
{
a[j+r] = a[j];
a[j] = temp;
j -= r;
}
}
x++;
std::cout << "第" << x << "步排序结果: ";
for (h=0;h<len;h++)
{
std::cout << a[h] << " "; // 输出
}
std::cout << std::endl;
}
}
import numpy as np
def ShellSort(value):
"""
Shell Sort/希尔排序/缩小增量排序
:param value: random value
:return: Sort value
"""
gap = l = len(value)
while (gap > 1):
gap = gap // 2
for i in range(l):
for j in range(i, l-gap, gap):
if value[j] > value[j+gap]:
value[j], value[j+gap] = value[j+gap], value[j]
print("ShellSort: ")
print(value)
def main():
list = np.random.randint(100, size=10)
print("排序前的数组为: ")
print(list)
ShellSort(list)
if __name__ == "__main__":
main()