#include<stdio.h> #include<time.h> #include<stdlib.h> #define N 1000 void sort(int arr[],int length,int element); int Main() { srand((unsigned)time(NULL)); int arr[N]; int n,i; //输入 FILE *fp; fp=fopen("status.txt","r"); fscanf(fp,"%d",&n); for(i=0;i<n;i++) { fscanf(fp,"%d",&arr[i]); } fclose(fp); //快排 sort(arr,n,arr[0]); //输出 FILE *fpp=fopen("statusprint.txt","w"); for(i=0;i<n;i++) { fprintf(fpp,"%d ",arr[i]); } fclose(fpp); return 0; } void sort(int arr[],int length,int element) { int i,j,k; i=j=k=0; int arr1[N]; int arr2[N]; int flag1,flag2; flag1=flag2=0; for(i=0;i<length;i++) { if(arr[i]<element) { arr1[j++]=arr[i]; } else { arr2[k++]=arr[i]; } } for(i=0;i<j;i++) { if(arr1[i]!=arr1[0]) { flag1=1; break; } } for(i=0;i<k;i++) { if(arr2[i]!=arr2[0]) { flag2=1; break; } } if(j<=1||flag1==0) { ; } else { int rand_j=rand()%(j); sort(arr1,j,arr1[rand_j]); } if(k<=1||flag2==0) { ; } else { int rand_k=rand()%(k); sort(arr2,k,arr2[rand_k]); } int arr1_length=j; j=k=0; for(i=0;i<length;i++) { if(j<arr1_length) { arr[i]=arr1[j++]; } else { arr[i]=arr2[k++]; } } }
时间: 2023-12-10 12:03:21 浏览: 25
这是一个使用快排算法对一个包含随机整数的文件进行排序的 C 语言程序。程序首先从一个名为 "status.txt" 的文件中读取一个整数 n 和 n 个整数,然后使用 sort 函数进行快排,最后将排序后的结果输出到一个名为 "statusprint.txt" 的文件中。
快排函数 sort 的实现使用了分治思想,将数组按照选定的元素(在本程序中是 arr[0])分成两个子数组,然后对子数组分别进行递归排序。如果子数组的长度小于等于1,或者子数组中的所有元素值都相等,那么就不需要再进行递归排序了,直接返回即可。
在分割数组时,程序会随机选取一个元素作为划分标准,以避免出现最坏情况下的时间复杂度 O(n^2)。
注意,程序中的数组长度 N 很大,如果输入文件中的整数个数超过了 N,程序可能会出现错误。同时,程序中的文件读写操作也没有进行错误检查,可能会导致程序崩溃。
相关问题
改进以下代码#include<stdio.h> #include<stdlib.h> #include<malloc.h> #define ar arr[]={12,21,2,11,10,8} #define ELEM_TYPE int int ar; //顺序表的创建: typedef struct Sqlist { ELEM_TYPE *data; int length; int SIZE; }Sqlist,*PSqlist; //顺序表的初始化: void Init_Sqlist(P
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAXSIZE 100 // 定义最大长度
typedef int ElemType; // 定义元素类型
typedef struct {
ElemType *data; // 动态分配数组
int length; // 当前长度
int maxSize; // 最大长度
} SqList;
// 初始化顺序表
void InitList(SqList *L) {
L->data = (ElemType *) malloc(sizeof(ElemType) * MAXSIZE); // 动态分配数组
L->length = 0; // 初始长度为0
L->maxSize = MAXSIZE; // 最大长度为MAXSIZE
}
// 插入元素
int Insert(SqList *L, int i, ElemType e) {
// i的合法范围为 1 <= i <= L->length + 1
if (i < 1 || i > L->length + 1) {
return 0; // 插入位置不合法
}
if (L->length >= MAXSIZE) {
return 0; // 当前存储空间已满,不能插入新元素
}
for (int j = L->length; j >= i; j--) {
L->data[j] = L->data[j - 1]; // 将第i个元素及之后的元素后移
}
L->data[i - 1] = e; // 插入新元素
L->length++; // 长度加1
return 1;
}
// 删除元素
int Delete(SqList *L, int i) {
// i的合法范围为 1 <= i <= L->length
if (i < 1 || i > L->length) {
return 0; // 删除位置不合法
}
for (int j = i; j < L->length; j++) {
L->data[j - 1] = L->data[j]; // 将第i+1个元素及之后的元素前移
}
L->length--; // 长度减1
return 1;
}
// 输出顺序表
void PrintList(SqList L) {
for (int i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
printf("\n");
}
int main() {
SqList L;
InitList(&L);
Insert(&L, 1, 1);
Insert(&L, 2, 3);
Insert(&L, 3, 5);
PrintList(L);
Delete(&L, 2);
PrintList(L);
return 0;
}
代码:#include<stdio.h> #include<stdlib.h> #include<time.h> #define N 5 void init_arr(int * arr,int len) { int i=0; for (i=0;i<len;i++){ arr[i]=rand()%20+1; } } void select_sort(int * arr,int len) { int i,j,k,tmp; for(i=0;i<len-1;i++){ k=j; for(j=i+1;j<len;j++){ if(arr[k]>arr[j])k=j; } if(i!=k){ tmp=arr[i]; arr[i]=arr[k]; arr[k]=tmp; } } } void print_arr(int * arr,int len) { int i; for(i=0;i<len;i++){ print("arr[%d]=%d\n",i,arr[i]); } } int main(void) { int arr[N]; srand(time(NULL)); init_arr(arr,N); print_arr(arr,N); select_sort(arr,N); print("------after sort-----\n"); print_arr(arr,N); return 87; }
这段代码实现了一个选择排序算法,可以对一个长度为N的数组进行排序。在代码中,包含了头文件<stdio.h>、<stdlib.h>、<time.h>,定义了常量N为5。主要函数包括:
1. init_arr函数:用于初始化数组,将数组中每个元素赋值为1到20之间的随机数。
2. select_sort函数:选择排序算法的实现,用于对数组进行排序。
3. print_arr函数:用于打印数组中的元素。
在主函数中,首先使用init_arr函数初始化数组,然后使用print_arr函数打印数组元素。接着调用select_sort函数进行排序,最后再次使用print_arr函数打印排序后的数组元素。
注意:在代码中,print函数应该改为printf函数。