正常现象,你是二进制方式写入文件的,不是文本方式。只要程序读取文件的结果是正确的就可以了。
那我该怎么修改二进制,让文本能够正常显示阿
//直接插入排序
void InsertSort(int R[],int n) { //待排关键字存储在R[]中,默认为整型,个数为n
int i,j,temp;
for (i=2; i<=n; ++i) {
temp=R[i] ;//将待插入关键字暂存于temp中
j=i-1;
/*下面这个循环完成了从待排关键字之前的关键字开始扫描,如果大于待排关键字,则后移一位*/
while (j>=0&&temp<R[j]) {
R[j+1]=R[j] ;
--j;
}
R[j+1]=temp; //找到插入位置, 将temp中暂存的待排关键字插入
}
}
//折半插入排序
void BInsertSort(int R[],int n) {
int i,j,low,high,mid,temp;
for(i=1; i<=n; i++) {
temp=R[i];
low=1;
high=i-1;
while(low<=high) {
mid=(low+high)/2;
if(temp>=R[mid])
low=mid+1;
else
high=mid-1;
}
for(j=i-1; j>=high+1; j--)
R[j+1]=R[j];
R[j+1]=temp;
}
}
//希尔排序
void ShellSort(int R[],int n) {
int i,j,d=n/2;
int temp;
while(d) {
for(i=d; i<n; i++) {
temp=R[i];
for(j=i-d; j>0 && R[j]>temp; j-=d)
R[j+d]=R[j];
R[j+d]=temp;
}
d/=2;
}
}
//冒泡排序
void BubbleSort(int R[],int n) { //默认待排序关键字为整型
int i,j, flag, temp;
for (i=n-1; i>=1; --i) {
flag=0;//变量flag用来标记本趟排序是否发生了交换
for(j=1; j<=i; ++j)
if (R[j-1]>R[j] ) {
temp=R[j] ;
R[j]=R[j-1] ;
R[j-1]=temp;
flag=1;//如果没发生交换,则flag的值为0;如果发生交换,则flag的值改为1
}
if(flag==0)//一趟排序过程中没有发生关键字交换,则证明序列有序,排序结束
return;
}
}
//快速排序
void QuickSort (int R[], int low, int high) { //对从R[low]到R [high]的关键字进行排序
int temp;
int i=low, j=high;
if (low<high) {
temp=R[low];
/*下面这个循环完成了一趟排序,即将数组中小于temp的关键字放在左边,大于temp的关键字放在右边*/
while(i<j) {
while (j>i&&R[j]>=temp) --j;//从右往左扫描, 找到一个小于temp的关键字
if(i<j) {
R[i]=R[j];//放在temp左边
++i;//i右移一位
}
while(i<j && R[i]<temp) ++i; //从左往右扫描,找到一个大于temp的关键字
if (i<j) {
R[j]=R[i] ;//放在temp右边
--j;//j左移一位
}
}
R[i]=temp;//将temp放在最终位置
QuickSort (R, low, i-1) ;//递归地对temp左边的关键字进行排序
QuickSort (R, i+1,high) ;//递归地对temp右边的关键字进行排序
}
}
//简单选择排序
void SelectSort (int R[],int n) {
int i,j,k;
int temp;
for (i=1; i<=n; ++i) {
k=i;
/*这个循环是算法的关键,它从无序序列中挑出一个最小的关键字*/
for (j=i+1; j<n; ++j)
if (R[k]>R[j])
k=j;
/*下面3句完成最小关键字与无序序列第一个关键字的交换*/
temp=R[i];
R[i]=R[k];
R[k]=temp;
}
}
/*本函数完成在数组R[1ow]到R[high]的范围内对在位置low上的结点进行调整-----用于堆排序*/
void Sift(int R[],int low,int high) { //这里 关键字的存储设定为从数组下标1开始
int i=low,j=2*i;//R[j]是R[i]的左孩子结点
int temp=R[i];
while(j<=high) {
if (j<high && R[j]<R[j+1])//若右孩子较大,则把j指向右孩子
++j;//j变为2*i+1
if (temp<R[j]) {
R[i]=R[j];//将R[j]调整到双亲结点的位置上
i=j;//修改i和j的值,以便继续向下调整
j=2*i;
} else
break;//调整结束
}
R[i]=temp;//被调整结点的值放入最终位置
}
/*堆排序函数*/
void HeapSort(int R[], int n) {
int i;
int temp;
for (i=n/2; i>0; i--)//建立初始堆
Sift (R,i,n);
for (i=n; i>1; i--) { //进行n-1次循环,完成堆排序
/*以下3句换出了根结点中的关键字,将其放入最终位置*/
temp=R[1];
R[1]=R[i];
R[i]=temp;
Sift(R,1,i-1);//在减少了1个关键字的无序序列中进行调整
}
}
void merge(int R[],int R1[],int low,int mid,int high) {
int i=low,j=mid+1,k=low;
while(i<=mid&&j<=high)
if(R[i]<=R[j]) R1[k++]=R[i++];
else R1[k++]=R[j++];
while(i<=mid) R1[k++]=R[i++];
while(j<=high) R1[k++]=R[j++];
}
void mergepass(int R[],int R1[],int len,int n) {
int i=1;
while(i+2*len-1<=n) {
merge(R,R1,i,i+len-1,i+2*len-1);
i+=2*len;
}
if(i+len-1<n) merge(R,R1,i,i+len-1,n);
else
while(i<=n) {
R1[i]=R[i];
i++;
}
}
//二路归并排序
void MergeSort(int R[],int n) {
int *R1,len=1;
R1=(int*)malloc(sizeof(int)*(n+1));
while(len<n) {
mergepass(R,R1,len,n);
len*=2;
mergepass(R1,R,len,n);
len*=2;
}
}