一、直接插入排序
/*************************************************************
直接插入排序 实现文件
更新于2020年6月22日
**************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sort.h"
void InsertSort(SeqList &L) /*直接插入排序*/
{
int i,j;
for(i=2;i<=L.length;i++){
// 请在这里补充代码,完成本关任务
/********** Begin *********/
KeyType key = L.r[i].key;
j=i-1;
while(j>=1 && L.r[j].key > key){
L.r[j+1].key=L.r[j].key;
j--;
}
L.r[j+1].key = key;
/********** End **********/
}
}
void SeqListInput(SeqList &L) /*输入若干记录的关键字,存放到顺序表L中*/
{
int i=1; KeyType x;
scanf("%d",&x);
while(x!=-1)
{
L.r[i++].key=x; scanf("%d",&x);
}
L.length=i-1;
}
void SeqListOutput(SeqList L) /*输出顺序表L中各记录的关键字*/
{
int i;
for(i=1;i<=L.length;i++)
printf("%d ",L.r[i].key);
printf("\n");
}
二、希尔排序
/*************************************************************
希尔排序 实现文件
更新于2020年6月22日
**************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sort.h"
void ShellInsert(SeqList &L, int d) /*对顺序表L作一趟增量为d的希尔插入排序*/
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
int i,j;
for(i=d+1;i<=L.length;i++){
if(L.r[i].key<L.r[i-d].key){
L.r[0]=L.r[i];
for(j=i-d;j>0 &&L.r[0].key<L.r[j].key;j-=d){
L.r[j+d]=L.r[j];
}
L.r[j+d]=L.r[0];
}
}
/********** End **********/
}
void ShellSort(SeqList &L) /*希尔排序*/
{
int d;
d=L.length/2;
while(d!=0) /*调用一趟增量为d的希尔插入排序*/
{
ShellInsert(L,d); d=d/2;
}
}
void SeqListInput(SeqList &L) /*输入若干记录的关键字,存放到顺序表L中*/
{
int i=1; KeyType x;
scanf("%d",&x);
while(x!=-1)
{
L.r[i++].key=x; scanf("%d",&x);
}
L.length=i-1;
}
void SeqListOutput(SeqList L) /*输出顺序表L中各记录的关键字*/
{
int i;
for(i=1;i<=L.length;i++)
printf("%d ",L.r[i].key);
printf("\n");
}
三、快速排序
/*************************************************************
快速排序 实现文件
更新于2020年6月22日
**************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sort.h"
int Partition(SeqList &L, int low, int high)
{
KeyType pivotkey = L.r[low].key;
L.r[0] = L.r[low];
while (low < high)
{
while (low < high && L.r[high].key >= pivotkey)
high--;
L.r[low] = L.r[high];
while (low < high && L.r[low].key <= pivotkey)
low++;
L.r[high] = L.r[low];
}
L.r[low] = L.r[0];
return low;
}
void QuickSort(SeqList &L, int low, int high) /*对顺序表L的子序列L.r[low…high]作快速排序*/
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
int i;
if (low < high)
{
i = Partition(L, low, high);
/********** End **********/
/*分别对左、右两部分进行递归排序*/
QuickSort(L,low,i-1);/*对左半区L.r[low..i-1]进行快速排序*/
QuickSort(L,i+1,high);/*对右半区L.r[i+1..high]进行快速排序*/
}
}
void SeqListInput(SeqList &L) /*输入若干记录的关键字,存放到顺序表L中*/
{
int i=1; KeyType x;
scanf("%d",&x);
while(x!=-1)
{
L.r[i++].key=x; scanf("%d",&x);
}
L.length=i-1;
}
void SeqListOutput(SeqList L) /*输出顺序表L中各记录的关键字*/
{
int i;
for(i=1;i<=L.length;i++)
printf("%d ",L.r[i].key);
printf("\n");
}
四、堆排序
/*************************************************************
堆排序 实现文件
更新于2020年6月22日
**************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sort.h"
void HeapAdjust(SeqList &L, int low, int high)
{/*已知L.r[low..high]中记录的关键字除L.r[low].key之外均满足堆的定义,*/
/*调整L.r[low].key,使L.r[low..high]成为一个新大顶堆。*/
// 请在这里补充代码,完成本关任务
/********** Begin *********/
int i = low, j = 2 * i;
KeyType temp = L.r[i].key;
while (j <= high) {
if (j < high && L.r[j].key < L.r[j + 1].key) {
j++;
}
if (temp >= L.r[j].key) {
break;
}
L.r[i].key = L.r[j].key;
i = j;
j = 2 * i;
}
L.r[i].key = temp;
/********** End **********/
}
void HeapSort(SeqList &L) /*堆排序*/
{
int i;
for(i=L.length/2;i>0;i--)/*从最后一个分支结点(编号为L.length/2)开始调整,建立初始堆*/
HeapAdjust(L,i,L.length);
for(i=L.length;i>1;i--)
{
L.r[0]=L.r[1];L.r[1]=L.r[i];L.r[i]=L.r[0];/*将堆顶L.r[1]和当前最后一个记录L.r[i]交换*/
HeapAdjust(L,1,i-1);/*将剩余记录L.r[1..i-1]重新调整为堆*/
}
}
void SeqListInput(SeqList &L) /*输入若干记录的关键字,存放到顺序表L中*/
{
int i=1; KeyType x;
scanf("%d",&x);
while(x!=-1)
{
L.r[i++].key=x; scanf("%d",&x);
}
L.length=i-1;
}
void SeqListOutput(SeqList L) /*输出顺序表L中各记录的关键字*/
{
int i;
for(i=1;i<=L.length;i++)
printf("%d ",L.r[i].key);
printf("\n");
}