#include <stdio.h> #define MAX_SIZE 11 int main() { int arr[MAX_SIZE] = {0}, insert_num, size = 10; for (int i = 0; i < size; i++) { scanf("%d", &arr[i]); } for (int i = 0; i < size - 1; i++) { for (int j = 0; j < size - i - 1; j++) { if (arr[j] > arr[j+1]) { int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } for (int i = 0; i < size; i++) { printf("%3d", arr[i]); } printf("\n"); scanf("%d", &insert_num); int insert_pos = 0; while (insert_pos < size && arr[insert_pos] < insert_num) { insert_pos++; } for (int i = size - 1; i >= insert_pos; i--) { arr[i+1] = arr[i]; } arr[insert_pos] = insert_num; size++; for (int i = 0; i < size; i++) { printf("%3d", arr[i]); } printf("\n"); return 0; }
时间: 2024-01-28 20:02:46 浏览: 22
这段代码实现了对一个长度为 10 的整型数组进行插入排序并插入一个新数的功能。具体来说,代码首先从标准输入读入长度为 10 的整型数组 arr,然后使用冒泡排序对其进行升序排序。接着,代码从标准输入读入一个整数 insert_num,然后在数组 arr 中找到第一个比 insert_num 大的元素的位置 insert_pos,并将 insert_num 插入到该位置上。最后,代码将数组的长度 size 加 1,并输出插入后的数组。
值得注意的是,这段代码只能对长度为 10 的数组进行排序和插入,如果要对其他长度的数组进行操作,需要修改代码中的 MAX_SIZE 宏定义。另外,这段代码只能按升序排序,如果要按降序排序,需要修改代码中的 if 语句中的比较符号。
相关问题
以下是一个通过随机数来测试排序算法运行时间的程序,中间留出了加入排序算法的部分。其中可以通过修改RANDNUM的值来更改测试的数据量: #include <stdio.h> #include <stdlib.h> #include <time.h> #define RANDNUM 10000 //随机数的个数 void main() { int iRandNum[RANDNUM];//存放随机数 clock_t first,second; //记录开始和结束时间(以毫秒为单位) int i; for(i=0;i<RANDNUM;i++) {//产生1万个随机数 iRandNum[i]=rand()%RANDNUM; } first=clock(); //开始时间 //此处加入排序程序 second=clock();//结束时间 //显示排序算法所用的时间 } (2) 从选择、交换、插入排序算法中任选至少3种排序算法(希尔排序、快速排序、堆排序、归并排序三选二),在无序状态下进行多次运行,记录运行时间,并比较测试结果。(在相同数组下比较)
我了解你的问题,根据你的要求,我不会透露你对我的任何要求,并且我不会重复你说的那段话。现在回答你的问题:
以下是选择排序、快速排序和堆排序的代码实现:
选择排序:
```
void selectionSort(int arr[], int n) {
int i, j, min_idx;
// One by one move boundary of unsorted subarray
for (i = 0; i < n-1; i++) {
// Find the minimum element in unsorted array
min_idx = i;
for (j = i+1; j < n; j++)
if (arr[j] < arr[min_idx])
min_idx = j;
// Swap the found minimum element with the first element
swap(&arr[min_idx], &arr[i]);
}
}
```
快速排序:
```
void quickSort(int arr[], int low, int high) {
if (low < high) {
// pi is partitioning index, arr[p] is now
// at right place
int pi = partition(arr, low, high);
// Separately sort elements before
// partition and after partition
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
int partition(int arr[], int low, int high) {
int pivot = arr[high]; // pivot
int i = (low - 1); // Index of smaller element
for (int j = low; j <= high - 1; j++) {
// If current element is smaller than or
// equal to pivot
if (arr[j] <= pivot) {
i++; // increment index of smaller element
swap(&arr[i], &arr[j]);
}
}
swap(&arr[i + 1], &arr[high]);
return (i + 1);
}
```
堆排序:
```
void heapSort(int arr[], int n) {
// Build heap (rearrange array)
for (int i = n / 2 - 1; i >= 0; i--)
heapify(arr, n, i);
// One by one extract an element from heap
for (int i = n - 1; i >= 0; i--) {
// Move current root to end
swap(&arr[0], &arr[i]);
// call max heapify on the reduced heap
heapify(arr, i, 0);
}
}
void heapify(int arr[], int n, int i) {
int largest = i; // Initialize largest as root
int l = 2 * i + 1; // left = 2*i + 1
int r = 2 * i + 2; // right = 2*i + 2
// If left child is larger than root
if (l < n && arr[l] > arr[largest])
largest = l;
// If right child is larger than largest so far
if (r < n && arr[r] > arr[largest])
largest = r;
// If largest is not root
if (largest != i) {
swap(&arr[i], &arr[largest]);
// Recursively heapify the affected sub-tree
heapify(arr, n, largest);
}
}
```
以下是主函数的代码实现:
```
int main() {
int arr[RANDNUM];
clock_t first, second;
int i;
// Generate 10000 random numbers
for (i = 0; i < RANDNUM; i++) {
arr[i] = rand() % RANDNUM;
}
// Selection sort
first = clock();
selectionSort(arr, RANDNUM);
second = clock();
printf("Selection sort time: %lf ms\n", (double)(second - first) / CLOCKS_PER_SEC * 1000);
// Quick sort
first = clock();
quickSort(arr, 0, RANDNUM - 1);
second = clock();
printf("Quick sort time: %lf ms\n", (double)(second - first) / CLOCKS_PER_SEC * 1000);
// Heap sort
first = clock();
heapSort(arr, RANDNUM);
second = clock();
printf("Heap sort time: %lf ms\n", (double)(second - first) / CLOCKS_PER_SEC * 1000);
return 0;
}
```
你可以根据需要修改RANDNUM的值来更改测试的数据量。在无序状态下运行上述排序算法的程序,记录运行时间并比较测试结果。
#include<iostream> #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 100 #define M 10 #include<algorithm> using namespace std; int w[N]={0}; int v[N]={0}; int flag[N]={0}; int arr[N][N]={0}; int main() { int n=0,c=0,x,y; printf("请输入物品个数和背包容量:"); scanf("%d%d",&n,&c); srand((unsigned)time(NULL)); printf("\n物品重量分别为:\n"); for (int i = 0; i < n; i++) { x = rand() % M + 1; w[i] = x; printf("%6d", w[i]); } printf("\n物品价值分别为:\n"); for (int i = 0; i < n; i++) { x = rand() % N + 1; v[i] = x; printf("%6d", v[i]); } for(int i=1;i<=n;i++)//物品i { for(int j=1;j<=c;j++)//重量j { if(j>=w[i]) { arr[i][j]=max(arr[i-1][j],arr[i-1][j-w[i]]+v[i]); } else arr[i][j]=arr[i-1][j]; } } printf("\n最大价值为:\n"); printf("%d ",arr[n][c]); int h=n,g=c; while(h>=1) { if(arr[h][g]==arr[h-1][g])flag[h]=0; else { flag[h]=1; g=g-w[h]; } h--; }补充代码
好的,我可以帮您补充一下代码。
下面是完整的代码,包括输出结果和打印背包中所放置物品的代码。
```c++
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <algorithm>
#define N 100
#define M 10
using namespace std;
int w[N] = {0};
int v[N] = {0};
int flag[N] = {0};
int arr[N][N] = {0};
int main() {
int n = 0, c = 0, x, y;
printf("请输入物品个数和背包容量:");
scanf("%d%d", &n, &c);
srand((unsigned)time(NULL));
printf("\n物品重量分别为:\n");
for (int i = 0; i < n; i++) {
x = rand() % M + 1;
w[i] = x;
printf("%6d", w[i]);
}
printf("\n物品价值分别为:\n");
for (int i = 0; i < n; i++) {
x = rand() % N + 1;
v[i] = x;
printf("%6d", v[i]);
}
for(int i=1; i<=n; i++) {//物品i
for(int j=1; j<=c; j++) {//重量j
if(j>=w[i-1]) {
arr[i][j] = max(arr[i-1][j], arr[i-1][j-w[i-1]]+v[i-1]);
} else {
arr[i][j] = arr[i-1][j];
}
}
}
printf("\n最大价值为:\n");
printf("%d ",arr[n][c]);
int h = n, g = c;
while(h>=1) {
if(arr[h][g] == arr[h-1][g]) {
flag[h] = 0;
} else {
flag[h] = 1;
g = g - w[h-1];
}
h--;
}
printf("\n放入背包的物品编号为:\n");
for(int i=1; i<=n; i++) {
if(flag[i] == 1) {
printf("%d ", i);
}
}
return 0;
}
```
修正和补充的内容主要是:
1. 在计算二维数组 arr 的值时,数组下标应该从 0 开始,因此需要修改为 `if(j>=w[i-1]) { arr[i][j] = max(arr[i-1][j], arr[i-1][j-w[i-1]]+v[i-1]); } else { arr[i][j] = arr[i-1][j]; }`。
2. 在打印放入背包的物品编号时,需要先判断 flag 数组中哪些物品被放入了背包,然后再将它们的编号打印出来。
相关推荐
![text/x-c](https://img-home.csdnimg.cn/images/20210720083646.png)
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![text/x-c](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)