//排序 默认递增
// 稳定性 指的是相同的值 如果该值在前面排序完之后 相对位置保持不变
//八大排序
// 4个简单 直接插入排序 (n个值 需要n-1趟)
// 4个难 希尔排序
// 稳定性:
//4个稳定:直接插入排序
//4个不稳定:希尔排序
// 如果是简单排序 那么就是双重for循环 里面套一个if()(除了基数)
// 直接插入排序 存在优化 可以通过对已排序好的序列 通过二分的方式 来找到待插入值的合适插入位置
//每一趟把待排序序列的第一个值 插入到前面的已排序好的序列中 稳定性 稳定
#include<stdio.h>
#include<assert.h>
#include "Seqlist.h"
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <quene>
void Insert_Sort(int arr[], int len)
{
for (int i = 1; i < len;i++)//控制的趟数
{
int tmp = arr[i];
int j = i - 1;
for (; j >= 0; j--)//控制的是对已排序好的序列的从右向左的访问
{
if (arr[j]>tmp)//如果比我取出来的值tmp大,向后移动
{
arr[j + 1] = arr[j];
}
else
{
break;
//情况1 遇到了不大于我的值 把值放回去
}
}
//情况2 越界了 把值放回去
arr[j+1] = tmp;
}
/*for (int i = 0; i < len; i++)
{
int tmp = arr[i];
int j = i - 1;
for (; j >= 0; j--)
{
if (arr[j] > tmp)
{
arr[j + 1] = arr[j];
}
else
{
break;
}
}
arr[j + 1] = tmp;
}*/
}
//希尔排序 (缩小增量排序) 对直接插入排序的优化
//特点 数据越有序 整体排序效率越高
// 当n比较小的时候 n~2也不会很大
//缩小增量数组的取值好坏和希尔排序的时间复杂度直接关联 O(n~1.3~n~1.7)或 O(n~1.5) 稳定性 不稳定 空间复杂度 O(1)
//但是又没有一个最优解
//但是它有一些规则
// 1 取值从大到小
// 2 取值尽量互素
// 3 最后一个增量必须是1
//
void shell(int arr[],int len, int gap_val)
{
for (int i = gap_val; i < len; i++)
{
int tmp = arr[i];
int j = i - gap_val;
for (; j >= 0; j--)
{
if (arr[j] > tmp)
{
arr[j + 1] = arr[j];
}
else
{
break;
}
}
arr[j + gap_val] = tmp;
}
/*void Shell(int arr[], int len, int gap_val)
{
for (int i = gap_val; i < len; i++)
{
int tmp = arr[i];
int j = i - gap_val;
for (; j >= 0; j--)
{
arr[j + 1] > arr[j];
}
else
break;
}
arr[j + gap_val] = tmp;
}*/
void Shell_Sort(int arr[], int len)
{
int Gap[] = { 5,3,1 };
int len_Gap = sizeof(Gap) / sizeof(Gap[0]);
for (int i = 0; i < len_Gap; i++)
{
shell(arr,len,Gap[i]);
}
}
//void Shell_Sort(int arr[], int len)
//{
// int Gap[] = { 5,3,1 };
// int len_Gap = sizeof(Gap) / sizeof(Gap[0]);
// for (int i = 0; i < len_Gap; i++)
// {
// Shell(arr, len, Gap[i]);
// }
//}