头文件
Sort_all.h
#pragma once
#ifndef _SORT_ALL_H_
#define _SORT_ALL_H_
// 插入排序
// 直接插入排序
void InsertSort(int* array, int size);
// 插入排序使用二分进行优化
void InsertSort_OP(int* array, int size);
// 希尔排序
void ShellSort(int* array, int size);
// 选择排序
void SelectSort(int* array, int size);
// 使用每次找最大最小元素对选择排序进行优化
void SelectSort_OP(int* array, int size);
// 堆调整 向下调整
void HeapAdjust(int* array, int size, int parent);
// 堆排序
void HeapSort(int* array, int size);
// 交换排序
// 冒泡排序
void BubbleSort(int* array, int size);
// 快速排序
// 三数取中法
int GetMidDataIndex(int* array, int left, int right);
// Horn版本分离数据
int partion1(int* array, int left, int right);
// 挖坑法
int partion2(int* array, int left, int right);
// 前后指针
int partion3(int* array, int left, int right);
// 递归实现快速排序
void QuickSort(int* array, int left, int right);
// 非递归实现快速排序
void QuickSortNor(int* array, int left, int right);
//归并排序
// 二路并归,将两组有序的数组合并成一组有序数组
void MergeData(int* array, int left, int mid, int right, int* temp);
// 归并排序 递归实现
void MergeSrot(int* array, int size);
// 非递归归并排序
void MergeSortNor(int* array, int size);
// 非比较排序
// 计数排序
void CountSort(int* array, int size);
// 基数排序--低关键码优先
void RadixSortLSD(int* array, int size);
// 高关键码优先
void RadixSortMSD(int* array, int size);
void swap(int *data1, int *data2);
void Print(int* array, int size);
#endif
Stack.h
#pragma once
#ifndef _STACK_H_
#define _STACK_H_
#define DataType int
#define MAX_SIZE 10
typedef struct Stack
{
DataType _array[MAX_SIZE];
int _size;
}Stack;
// 初始化栈
void StackInit(Stack* s);
// 压栈
void StackPush(Stack* s, DataType data);
// 出栈
void StackPop(Stack* s);
// 获取栈顶元素
DataType StackTop(Stack* s);
// 获取栈中元素个数
int StackSize(Stack* s);
// 检测栈是否为空
int StackEmpty(Stack* s);
#endif //_STACK_H_
源文件
0_InsertSort.c
// 插入排序
#include "Sort_all.h"
//############################################################## 1.1 直接插入排序
// 直接插入排序
//最优情况下:时间效率为O(n)
//最差情况下:时间复杂度为O(n^2)
//空间复杂度:O(1),它是一种稳定的排序算法
void InsertSort(int* array, int size)
{
for (int i = 1; i < size; i++)
{
int temp = array[i];//存放要插入的数据
int index = i;
while (index > 0 && temp < array[index - 1])//查找位置,和前面的数据依次比较,如果比前一个数据小,则将前一个数据后移,继续查找
{
array[index] = array[index - 1];//数据后移
index--;
}
if (index != i)
array[index] = temp;//将要数据插入
}
}
//############################################################## 1.2 直接插入排序优化 二分法
int _InsertSort_OP(int *array, int left, int right, int data)
{
if (right > left)
{
int mid = left + ((right - left) >> 2);
if (data >= array[mid])
return _InsertSort_OP(array, mid + 1, right, data);
else
return _InsertSort_OP(array, left, mid , data);
}
else return right;
}
// 插入排序使用二分进行优化
void InsertSort_OP(int* array, int size)
{
int InsertAddr;
for (int i = 1; i < size; i++)
{
int temp = array<