Files
AssemblyHomework/1/exp2/insert_sort.cpp
2024-05-02 21:49:44 +08:00

60 lines
1.3 KiB
C++

#include "stdio.h"
/*
插入排序:将一个元素插入到一个已经排好序的序列中,使得序列依然有序。
*/
// 统计比较次数
int compare_count = 0;
// 从后往前查找第一个比v[n]小的元素,其后一个位置即为插入位置
int search(int v[], int n)
{
int i;
int tmp = v[n];
for (i = n - 1; i >= 0; i--)
{
compare_count++; // 统计比较次数
if (v[i] <= tmp)
break;
}
return i + 1;
}
// 将新的元素插入到指定位置,并将后续元素后移
void insert(int *v, int k, int n)
{
int i;
int tmp = v[n];
for (i = n - 1; i >= k; i--)
{
v[i + 1] = v[i];
}
v[k] = tmp;
}
void insertion_sort(int v[], int n)
{
int i;
for (i = 1; i < n; i++)
{ // 从第二个元素开始,依次插入到前面已经排好序的序列中
int place = search(v, i);
insert(v, place, i);
}
}
int main()
{
FILE *infile, *outfile;
int buffer[1001];
infile = fopen("a.in", "rb");
fread(buffer, 4, 1001, infile);
fclose(infile);
int N = buffer[0];
insertion_sort(&(buffer[1]), N);
buffer[0] = compare_count;
outfile = fopen("a.out", "wb");
fwrite(buffer, 4, N + 1, outfile);
fclose(outfile);
return 0;
}