插入排序思路:
1.默认一个数组的第一个数是有序的,下标第二个元素与第一个元素比较,如果小于第一个元素,插入到第一个元素之前;
2.前两个元素有序,第三个元素与前两个比较,插入到大小真确的位置;
3.重复排序步骤;
细
void insert_sort(int nums[],int len)//插入排序
{
int i, j, value;
for ( i = 0; i < len - 1; i++) //大循环n-1次
{
value = nums[i + 1];//记录需要进行插入的数
for (j = i + 1; j >= 0 && value < nums[j - 1]; j--)//后一个元素小于前一个元素
{
nums[j] = nums[j - 1];
}
nums[j] = value;
}
}
节:默认第一个元素有序,大循环执行 n-1次 n为数组长度;
时间复杂度O(n^2) 空间复杂度O(1)
希尔排序:
1.按增量序列个数k,对序列进行k 趟排序;
2.每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。
一般来说,初始增量为n/2,每一趟循环继续除以二
void shell_sort(int nums[], int len)
{
int i, j, value;
for (int k = len / 2; k > 0; k /= 2)
{
for (i = k; i < len-1; i++)
{
value = nums[i+1];
for (j = i+1; j >= 0 && value < nums[j - k]; j-= k)
{
nums[j] = nums[j - k];
}
nums[j] = value;
}
}
}
时间复杂度O(n^1.3) 空间复杂度O(1)
运行截图