#ifndef SORT_H
#define SORT_H
#include"Head.h"
#include"List.h"
#include"Stack_Queue.h"
#include"Tree.h"
#define MAXSIZE 20
#define MAX_NUM_OF_KEY 8//关键字项数最大值,即关键字位数
#define RADIX 10//关键字基数,即关键字从最小到最大的位数
#define MAX_SAPCE 1000//
typedef int KeyType;
typedef struct {
int key;
int next;
}SLNode;
typedef struct {
SLNode r[MAXSIZE];
int length;
}SLinkListType;
typedef struct {
KeyType keys[MAX_NUM_OF_KEY];
int next;
}SLCell;
typedef struct {
SLCell r[MAX_SAPCE];//静态链表可利用空间
int keynum;//记录的当前关键字个数
int recnum;//静态链表的当前长度
}SLList;
typedef int ArrType[RADIX];//指针数组类型
//习题结构类型
typedef enum { _Red, _White, _Blue }Flag_Color;
//创建数列
//0号位开始
void FileToSqList(SqList* L, FILE* fp);
//1号位开始
void FileToSqList_1(SqList* L, FILE* fp);
void FileToHLinkList(HLinkList* L, FILE* fp);
//直接插入排序
void InsertSort(SqList* L);
//折半插入排序
void BinaryInsertSort(SqList* L);
//2-路插入排序
void Two_WayInserSort(SqList L, SqList* T, int* first, int* final);
//表排序
void TableInsertSort(SLinkListType* L);
//希尔排序
void ShellInsert(SqList* L, int dk);
void ShellSort(SqList* L, int dlta[], int t);
//起泡排序
void Buswap(int* a, int* b);
void BubbleSort(SqList* L, ...);
//双向起泡算法
void Two_WayBubbleSort(SqList* L);
//双向起泡算法优化版
void Two_WayBubbleSort_Optimize(SqList* L);
//快速排序
int Partition(SqList* L, int low, int high);
void QSort(SqList* L, int low, int high);
void QuickSort(SqList* L);
//简单选择排序
void Simple_SelectionSort(SqList* L, ...);
//树选择排序
void Tree_SelectionSort();
//堆排序
void HeapAdjust(SqList* T, int s, int m, ...);
void HeapSort(SqList* T, ...);
//2-路归并排序
void Merge(SqList L, SqList* T, int s, int m, int t);
void MSort(SqList L, SqList* T, int s, int m);
void Two_WayMergeSort(SqList* L, int i, int j);
//基数排序
void RadixSort();
//链式基数排序
int succ(ArrType f, int i);
void Collect(SLList* L, ArrType f, ArrType e);
void Distribute(SLList* L, int i, ArrType f, ArrType e);
void Link_RadixSort(SLList* L);
#endif // !SORT_H
#ifndef SORT_H
#define SORT_H
#include"Head.h"
#include"List.h"
#define MAXSIZE 20
#define MAX_NUM_OF_KEY 8//关键字项数最大值,即关键字位数
#define RADIX 10//关键字基数,即关键字从最小到最大的位数
#define MAX_SAPCE 1000//
typedef int KeyType;
typedef struct {
int key;
int next;
}SLNode;
typedef struct {
SLNode r[MAXSIZE];
int length;
}SLinkListType;
typedef struct {
KeyType keys[MAX_NUM_OF_KEY];
int next;
}SLCell;
typedef struct {
SLCell r[MAX_SAPCE];//静态链表可利用空间
int keynum;//记录的当前关键字个数
int recnum;//静态链表的当前长度
}SLList;
typedef int ArrType[RADIX];//指针数组类型
//直接插入排序
void InsertSort(SqList* L);
//折半插入排序
void BinaryInsertSort(SqList* L);
//2-路插入排序
void Two_WayInserSort(SqList L, SqList* T, int* first, int* final);
//表排序
void TableInsertSort(SLinkListType* L);
//希尔排序
void ShellInsert(SqList* L, int dk);
void ShellSort(SqList* L, int dlta[], int t);
//起泡排序
void Buswap(int* a, int* b);
void BubbleSort(SqList* L, ...);
//双向起泡算法
void Two_WayBubbleSort(SqList* L);
//双向起泡算法优化版
void Two_WayBubbleSort_Optimize(SqList* L);
//快速排序
int Partition(SqList* L, int low, int high);
void QSort(SqList* L, int low, int high);
void QuickSort(SqList* L);
//简单选择排序
void Simple_SelectionSort(SqList* L, ...);
//树选择排序
void Tree_SelectionSort();
//堆排序
void HeapAdjust(SqList* T, int s, int m, ...);
void HeapSort(SqList* T, ...);
//2-路归并排序
void Merge(SqList L, SqList* T, int s, int m, int t);
void MSort(SqList L, SqList* T, int s, int m);
void Two_WayMergeSort(SqList* L, int i, int j);
//基数排序
void RadixSort();
//链式基数排序
int succ(ArrType f, int i);
void Collect(SLList* L, ArrType f, ArrType e);
void Distribute(SLList* L, int i, ArrType f, ArrType e);
void Link_RadixSort(SLList* L);
#endif // !SORT_H
#ifndef SORT_C
#define SORT_C
#include"InSort.h"
//直接插入排序
void InsertSort(SqList* L) {
int i, j;
if ((*L).length > 1)
for (i = 2; i <= (*L).length; i++) {
if ((*L).elem[i] < (*L).elem[i - 1]) {
(*L).elem[0] = (*L).elem[i];
(*L).elem[i] = (*L).elem[i - 1];
for (j = i - 2; (*L).elem[0] < (*L).elem[j]; --j)
(*L).elem[j + 1] = (*L).elem[j];
(*L).elem[j + 1] = (*L).elem[0];
}
}
}
//折半插入排序
void BinaryInsertSort(SqList* L) {
int i, j, low, high, m;
for (i = 2; i <= (*L).length; i++) {
(*L).elem[0] = (*L).elem[i];
low = 1;
high = i - 1;
while (low <= high) {
m = (low + high) / 2;
if ((*L).elem[0] < (*L).elem[m]) high = m - 1;
else low = m + 1;
}
for (j = i - 1; j >= high + 1; --j)
(*L).elem[j + 1] = (*L).elem[j];
(*L).elem[high + 1] = (*L).elem[0];
}
}
//2-路插入排序
void Two_WayInserSort(SqList L,SqList* T,int* first,int* final) {
int i, j;
(*T).elem[1] = L.elem[1];
(*T).length = L.length;
*first = 1; *final = 1;
for (i = 2; i <= L.length; i++) {
if (L.elem[i] < (*T).elem[1]) {
if (!(*first - 1)) {
*first = L.length;
(*T).elem[*first] = L.elem[i];
}
else {
for (j = *first; (*T).elem[j] < L.elem[i]; ++j)
(*T).elem[j - 1] = (*T).elem[j];
(*T).elem[j - 1] = L.elem[i];
(*first)--;
}
}
else {
for (j = *final; (*T).elem[j] > L.elem[i]; --j)
(*T).elem[j + 1] = (*T).elem[j];
(*T).elem[j + 1] = L.elem[i];
(*final)++;
}
}
}
//表排序
void TableInsertSort(SLinkListType* L) {
int i, j;
SLNode* p;
(*L).r[0].next = 1;
(*L).r[1].next = 0;
for (i = 2; i <= (*L).length; i++) {
p = &(*L).r[0];
j = (*p).next;
while ((*L).r[i].key > (*L).r[j].key) {
p = &(*L).r[j];
j = (*p).next;
}
(*p).next = i;
(*L).r[i].next = j;
}
}
//希尔排序
void ShellInsert(SqList* L, int dk) {
int i, j, k;
for (i = 1; i <= dk; i++)
for (j = i + dk; j <= (*L).length; j += dk) {
if ((*L).elem[j] < (*L).elem[j - dk]) {
(*L).elem[0] = (*L).elem[j];
(*L).elem[j] = (*L).elem[j - dk];
for (k = j - 2 * dk; (*L).elem[0] < (*L).elem[k]; j -= dk)
(*L).elem[k + dk] = (*L).elem[k];
(*L).elem[k + dk] = (*L).elem[0];
}
}
}
void ShellSort(SqList* L, int dlta[], int t) {
for (int k = 0; k < t; k++)
ShellInsert(L, dlta[k]);
}
//起泡排序
void Buswap(int* a, int* b) {
int t;
t = *a;
*a = *b;
*b = t;
}
void BubbleSort(SqList* L, ...) {
va_list ap;
va_start(ap, L);
char* t = va_arg(ap, char*);
va_end(ap);
int i, j;
if (!strcmp("MAX", t))
for (i = 0; i < (*L).length; i++)
for (j = 2; j <= (*L).length - i; j++) {
if ((*L).elem[j] > (*L).elem[j - 1])
Buswap(&(*L).elem[j], &(*L).elem[j - 1]);
}
else if (!strcmp("MIN", t))
for (i = 0; i < (*L).length; i++)
for (j = 2; j <= (*L).length - i; j++) {
if ((*L).elem[j] < (*L).elem[j - 1])
Buswap(&(*L).elem[j], &(*L).elem[j - 1]);
}
}
//双向起泡算法
void Two_WayBubbleSort(SqList* L) {
int k, t, st, ed;
st = 1; ed = (*L).length - 1;
do {
for (k = 1, t = 0; k <= ed; k++) {
if ((*L).elem[k] > (*L).elem[k + 1]) {
Buswap(&(*L).elem[k], &(*L).elem[k + 1]);
t = 1;
}
}
if (!t)
break;
for (k = ed, t = 0; k >= st + 1; k--)
if ((*L).elem[k] < (*L).elem[k - 1]) {
Buswap(&(*L).elem[k], &(*L).elem[k - 1]);
t = 1;
}
} while (t);
}
//双向起泡算法优化版
void Two_WayBubbleSort_Optimize(SqList* L) {
int st, ed, tag, i, j, t, k;//st起点,ed终点,tag指示正逆序,t下次循环的起点,k增量
st = 1; ed = (*L).length;
tag = 0;
k = 1;
while (1) {
j = st;
for (i = st, t = 0; i != ed; i += k)
if ((*L).elem[i] > (*L).elem[i + 1]) {
Buswap(&(*L).elem[i], &(*L).elem[i + 1]);
t = 1;
}
if (!t)
break;
k = -k;
st = ed + 2 * k;
ed = j + k;
}
}
//快速排序
int Partition(SqList* L, int low, int high) {
(*L).elem[0] = (*L).elem[low];
while (low < high) {
while (low < high && (*L).elem[high] >= (*L).elem[0])
high--;
(*L).elem[low] = (*L).elem[high];
while (low < high && (*L).elem[low] <= (*L).elem[0])
low++;
(*L).elem[high] = (*L).elem[low];
}
(*L).elem[low] = (*L).elem[0];
return low;
}
void QSort(SqList* L, int low, int high) {
if (low < high) {
int mid = Partition(L, low, high);
QSort(L, low, mid - 1);
QSort(L, mid + 1, high);
}
}
void QuickSort(SqList* L) {
QSort(L, 1, (*L).length);
}
//简单选择排序
void Simple_SelectionSort(SqList* L, ...) {
int i, j, pos;
va_list ap;
va_start(ap, L);
char* t = va_arg(ap, char*);
va_end(ap);
if (strcmp(t, "MAX"))
for (i = 1; i < (*L).length; i++) {
int max = (*L).elem[i];
pos = i;
for (j = i + 1; j <= (*L).length; j++)
if (max < (*L).elem[j]) {
pos = j;
max = (*L).elem[j];
}
if (pos != i)
Buswap(&(*L).elem[i], &(*L).elem[pos]);
}
else
for (i = 1; i < (*L).length; i++) {
int min = (*L).elem[i];
pos = i;
for (j = i + 1; j <= (*L).length; j++)
if (min > (*L).elem[j]) {
pos = j;
min = (*L).elem[j];
}
if (pos != i)
Buswap(&(*L).elem[i], &(*L).elem[pos]);
}
}
//树选择排序
void Tree_SelectionSort() {
}
//堆排序
void HeapAdjust(SqList* T, int s, int m, ...) {
va_list ap;
va_start(ap, m);
char* t = va_arg(ap, char*);
va_end(ap);
int j, rc;
rc = (*T).elem[s];
if (!strcmp(t, "SMA")) {
for (j = 2 * s; j <= m; j *= 2) {
if (j < m && (*T).elem[j] <= (*T).elem[j + 1])
++j;
if (rc >= (*T).elem[j] || j > (*T).length)
break;
(*T).elem[s] = (*T).elem[j];
s = j;
}
}
else {
for (j = 2 * s; j <= m; j *= 2) {
if (j < m && (*T).elem[j] >= (*T).elem[j + 1])
++j;
if (rc <= (*T).elem[j] || j > (*T).length)
break;
(*T).elem[s] = (*T).elem[j];
s = j;
}
}
(*T).elem[s] = rc;
}
void HeapSort(SqList* T, ...) {
va_list ap;
va_start(ap, T);
char* t = va_arg(ap, char*);
va_end(ap);
int i;
for (i = (*T).length / 2; i; i--)
HeapAdjust(T, i, (*T).length, t);
for (i = (*T).length; i; i--) {
Buswap(&(*T).elem[1], &(*T).elem[i]);
HeapAdjust(T, 1, i - 1, t);
}
}
//2-路归并排序
void Merge(SqList L,SqList* T,int s,int m,int t) {
int i, j, k;
for (i = s, j = m + 1, k = s; i <= m && j <= t;) {
if (L.elem[i] > L.elem[j]) (*T).elem[k++] = L.elem[j++];
else (*T).elem[k++] = L.elem[i++];
}
while (j <= t) {
(*T).elem[k++] = L.elem[j++];
}
while (i <= m)
(*T).elem[k++] = L.elem[i++];
//从小到大
}
void MSort(SqList L,SqList* T,int s,int m) {
SqList R;
InitSqList(&R);
if (s == m)
(*T).elem[s] = L.elem[m];
else {
int t = (m + s) / 2;
MSort(L, &R, s, t);
MSort(L, &R, t + 1, m);
Merge(R, T, s, t, m);
}
}
void Two_WayMergeSort(SqList* L,int i,int j) {
MSort(*L, L, i, j);
}
//链式基数排序
int succ(ArrType f,int i) {
while (!f[i] && i < RADIX)
i++;
return i;
}
void Collect(SLList* L,ArrType f,ArrType e) {
int i, j, t;
i = 0;
j = succ(f, i);
(*L).r[0].next = f[j];
t = e[j];
while (j < RADIX) {
for (j = succ(f, j + 1); j < RADIX - 1 && !f[j]; j = succ(f, j + 1));
if (f[j] && j < RADIX) {
(*L).r[t].next = f[j];
t = e[j];
}
}
(*L).r[t].next = 0;
}
void Distribute(SLList* L,int i,ArrType f,ArrType e) {
int p, q, j;
q = 0; j = (*L).r[0].next;
while (q < (*L).recnum) {
p = (*L).r[j].keys[i];
if (!f[p])
f[p] = j;
else
(*L).r[e[p]].next = j;
e[p] = j;
j = (*L).r[j].next;
q++;
}
}
void Link_RadixSort(SLList* L) {
ArrType f, e;
int i, j;
for (j = 0; j < (*L).keynum; j++) {
for (i = 0; i < (*L).recnum; f[i] = 0, e[i] = 0, i++);
Distribute(L, j, f, e);
Collect(L, f, e);
}
}
#endif // !SORT_C