数据存储
#define ElemType int
typedef struct {
ElemType *elem;
int Length;
int ListSize;
}SqList;
数据初始化
下标为0的没有存储数据
void InitList(SqList &L)//创建线性表函数
{
L.elem = (ElemType*)malloc(100 * sizeof(ElemType));
L.Length = 0;
L.ListSize = 100;
}
void InitData(SqList &L, int length)//初始化元素函数
{
printf("请输入%d个线性表的元素:\n", length);
for (int i = 1; i <=length; i++)
{
scanf("%d", &L.elem[i]);
}
//更改线性表的长度
L.Length = length;
}
数据打印
void PrintSqList(SqList L) {
//printf("顺序表为:\n");
for (int i = 1; i <= L.Length; i++)
{
printf("%d\t", L.elem[i]);
}
printf("\n");
}
插入排序
void InsertSort(SqList &L) {
for (int i = 2; i <= L.Length; i++) //从第二个数开始比较
if (L.elem[i] < L.elem[i-1]) {//如果当前的值,小于前面的值
L.elem[0] = L.elem[i];//就让当前的那个放在0处,哨兵
L.elem[i] = L.elem[i - 1];//把前一个的值赋值给当前的值
int j;
for (j = i - 2; j > 0 && L.elem[0] < L.elem[j]; j--)
L.elem[j + 1] = L.elem[j];
L.elem[j + 1] = L.elem[0];
}//if
}
折半排序
void BinSort(SqList &L) {
for (int i = 2; i <= L.Length; i++) {
L.elem[0] = L.elem[i];//把第二个作为哨兵
//下面while类似于折半查找
int low = 1;
int high = i - 1;
int mid;
while (low <= high) {
mid = (low + high) / 2;
if (L.elem[0] < L.elem[mid])
high = mid - 1;
else
low = mid + 1;
}//while
for (int j = i - 1; j >= high + 1; j--) {
L.elem[j + 1] = L.elem[j];
}
L.elem[high + 1] = L.elem[0];
}
}
希尔排序
void ShellInsert(SqList &L, int dk) {
for (int i = dk + 1; i <= L.Length; i++)
if (L.elem[i] < L.elem[i-dk]) {
L.elem[0] = L.elem[i];
int j;
for (j = i - dk; j > 0 && L.elem[0] < L.elem[j]; j -= dk)
L.elem[j + dk] = L.elem[j];
L.elem[j + dk] = L.elem[0];
}
}
void ShellSort(SqList &L, int dlta[], int t) { //传入增量数组
for (int k = 0; k < t; k++) {
ShellInsert(L, dlta[k]);
}
}
快速排序
int Partition(SqList &L, int low, int high) {
L.elem[0] = L.elem[low];
int pivokey = L.elem[low];
while (low < high) {
while (low < high&&L.elem[high] >= pivokey)--high;
L.elem[low] = L.elem[high];
while (low < high&&L.elem[low] <= pivokey)++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 p = Partition(L, low, high);
QSort(L,low, p - 1);
QSort(L, p+1, high);
}
}
选择排序
void SelectSort(SqList &L)
{
int i = 1;
for (i = 1; i <= L.Length - 1; i++)
{
int j = i;
int min = i;//记录最小值的下标
for (j = i + 1; j < L.Length; j++)
{
if (L.elem[j] < L.elem[min])
{
min = j;
}
}
if (min != i)//将最小值放在正确的位置
{
int temp = L.elem[i];
L.elem[i] = L.elem[min];
L.elem[min] = temp;
}
}
}
主函数
int main(){
SqList L;
InitList(L);
InitData(L,7);
printf("\n");
InsertSort(L);
BinSort(L);
int data[3] = { 5,3,1 };
ShellSort(L, data, 3);
QSort(L, 1, 7);
SelectSort(L);
PrintSqList(L);
system("pause");
}