利用静态查找表直接插入排序、折半插入排序。
输入:输入包括多行,每行代表一定的含义
输入1,创建静态查找表,接着输入n表示查表中元素个数,再输入n个整数
输入2 1,代表使用插入排序,按照升序排序;
输入2 -1,代表使用插入排序,按照降序排序;
输入3,代表使用折半插入排序,按照升序排序;
输入0,程序结束。
输出
按照输入的顺序依次输出相关信息。
1 3 101 105 102 2 1 0
样例输出
101 102 105
#include <stdio.h>
#include<iostream>
using namespace std;
#define MAXSIZE 20 //记录最大个数
typedef struct {
int data[MAXSIZE + 1]; //data[0]可闲置或作监视哨
int length; //顺序表长度
}SqList;
//创建顺序表
void CreateSqList(SqList& L, int n) {
int i;
L.length = n;
for (i = 1; i <= L.length; i++) {
scanf("%d", &L.data[i]);
getchar();
}
}
//输出顺序表
void PrintSqList(SqList& L) {
int i;
for (i = 1; i <= L.length; i++)
printf("%d\n", L.data[i]);
}
//直接插入排序,Acc=1表示升序,Acc=-1表示降序
void InsertSort(SqList& L, int Acc) {
int i, j;
if (Acc == 1) {
for (i = 2; i <= L.length; i++)
{
if (L.data[i] < L.data[i - 1])
{
L.data[0] = L.data[i];
for (j = i - 1; L.data[j] > L.data[0]; j--)
L.data[j + 1] = L.data[j];
L.data[j + 1] = L.data[0];
}
}
}
if (Acc == -1)
{
for (i = 2; i <= L.length; i++)
{
if (L.data[i] > L.data[i - 1])
{
L.data[0] = L.data[i];
for (j = i - 1; L.data[j] < L.data[0]; j--)
L.data[j + 1] = L.data[j];
L.data[j + 1] = L.data[0];
}
}
}
}
//折半插入排序
void BInsertSort(SqList& L) {
for (int i = 2; i <= L.length; i++)
{
L.data[0] = L.data[i];
int low = 1, high = L.length ;
while (low <= high)
{
int m = (low + high) / 2;
if (L.data[0] < L.data[m])
high = m - 1;
else
low = m + 1;
}
for (int j = i - 1; j >= high + 1; j--)
L.data[j + 1] = L.data[j];
L.data[high + 1] = L.data[0];
}
}
//主函数
int main() {
int n, Acc;
SqList List, TempList;
int select;
while (scanf("%d", &select) != EOF) {
getchar();
if (select == 0)
return 0;
else if (select == 1) {
scanf("%d", &n);
CreateSqList(List, n);
}
if (select == 2) {
TempList = List;
scanf("%d", &Acc);
getchar();
InsertSort(TempList, Acc);
PrintSqList(TempList);
}
else if (select == 3) {
TempList = List;
BInsertSort(TempList);
PrintSqList(TempList);
}
}
return 0;
}