希尔排序使用插入排序对间隔为N的序列进行排序,并不断减小间隔,最后间隔为1,就使得整个数组是有序的。
cpp:
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
void shellsort(std::vector<int> &nums)
{
int N = nums.size();
int k = 0;
for (int Increment = N; Increment > 0; Increment /= 2)
{
// insertsort
for (int i = Increment; i < N; i++)
{
int temp = nums[i];
int j;
for (j = i - Increment; j >= 0; j -= Increment)
{
if (nums[j] > temp)
{
nums[j + Increment] = nums[j];
// std::cout << j;
}
else
{
break;
}
}
nums[j + Increment] = temp;
std::cout << "The " << k << " sorted:" << std::endl;
for (int m = 0; m < N; m++)
{
std::cout << nums[m] << " ";
}
std::cout << std::endl;
k++;
}
}
}
int main()
{
std::vector<int> nums;
srand((unsigned int)(time(NULL)));
for (int i = 0; i < 10; i++)
{
nums.push_back(rand() % 1000);
}
std::cout << "The nums:" << std::endl;
for (int i = 0; i < nums.size(); i++)
{
std::cout << nums[i] << " ";
}
std::cout << std::endl;
shellsort(nums);
std::cout << "After sorting:" << std::endl;
for (int i = 0; i < nums.size(); i++)
{
std::cout << nums[i] << " ";
}
std::cout << std::endl;
system("pause");
return 0;
}
python:
import numpy as np
def shellsort(nums):
N = len(nums)//2
while(N > 0):
for i in range( N, len(nums)):
tmp = nums[i]
j = i - N
while j >= 0 and tmp < nums[j]:
nums[j + N] = nums[j]
j -= N
nums[j + N] = tmp
N //= 2
return nums
if __name__ == "__main__":
nums = np.random.randint(0, 100 ,10)
print(nums)
print(shellsort(nums))