TA release HW1
This commit is contained in:
59
1/exp2/insert_sort.cpp
Normal file
59
1/exp2/insert_sort.cpp
Normal file
@@ -0,0 +1,59 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user