我的问题是:在调用排序函数中,我先得到每个人的平均分放入一维数组,再10-16行冒泡法排完序后得到此时的序号,但是不知道第二步想法成不成立,或者该怎么做,以下是我的代码,谢谢
这样写的 存的 c 肯定是不对的, 排序会比较很多次的,而且 也不能说第一次就是最小或最大的数,这样 复制c数组是有问题的
可以这样:
void paixu(int (*p)[4])
{
int i, j, t, b[5], c[5];
for (i = 0; i < 5;i++)
{
int sum = 0;
for (j=0;j < 4;j++)
sum += *(*(p + j) + j);
b[i] = sum / 4;
c[i] = i;
}
for(i=0;i< 4; i++)
{
for(j=0;j<4-i;j++)
if(b[j]<b[j+1])
{
t=b[j+1];
b[j+1]=b[j];
b[j]=t;
t=c[j+1];
c[j+1]=c[j];
c[j] = t;
}
}
printf("按平均成绩排序从大到小学号依此是:");
for (i=0; i < 5;i++)
printf("%d", c[i]);
}
算法思路:先将字符串入栈,然后出栈时一个一个和字符串对比,如果全部相同则表示对称,否则不对称。
algotirhm.c
#include "algorithm.h"
//判断字符串是否是对称串
bool symmetry(ElemeType_SStk str[])
{
SqStack s;//创建一个栈
int i;
ElemeType_SStk e;
InitStack(s);//初始化一个栈
for (i = 0; str[i]!='\0'; i++)
{
Push(s, str[i]);//入栈
}
for (i = 0; str[i] != '\0'; i++)
{
Pop(s, e);
if (str[i] != e)
{
DestroyStack(s);//栈用完了得销毁
return false;
}
}
DestroyStack(s);//栈用完了得销毁 无论是true还是false,使用完的栈都要销毁
return true;
}
algotirhm.h
#ifndef _INC_ALGORITHM
#define _INC_ALGORITHM
/*
用于验证底层
用于设计算法
*/
#include "stack.h"
bool symmetry(ElemeType_SStk str[]);//判断字符串是否是对称串
#endif
main.c
#include "algorithm.h"
ElemeType_SStk str[10] = { 1,2,3,4,4,3,2,1 };
int main()
{
if (symmetry(str))printf("true\n");
else printf("false\n");
return 0;
}
根据您提供的问题,您想要编写一个函数实现在一个包含5个学生和4个课程成绩的数组中找到有课程不及格的学生,并输出他们的序号和全部课程成绩及平均成绩。同时,您希望能够按每个学生平均成绩由高到低对该数组进行排序。因此,您需要采用一些排序算法来实现这个功能。下面我给您介绍几种可能适用的算法:
void BubbleSort(int *arr, int n) {
for (int i = 0; i < n - 1; i++) {
int flag = 1; // 标记当前轮是否发生了交换
for (int j = 0; j < n - 1 - i; j++) {
if (arr[j] > arr[j + 1]) { // 交换位置
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = 0;
}
}
if (flag) break; // 如果当前轮未发生交换,则说明已有序,直接返回
}
}
快速排序 快速排序是一种常用的排序算法,它的核心思想是通过一趟排序将待排序的记录分隔成独立的两部分,前一部分记录的关键字均比后一部分记录的关键字小,然后对这两部分记录分别进行排序,以达到整个序列有序的目的。快速排序的基本思路如下:
选择一个基准元素,通常选择第一个元素或最后一个元素;
具体实现步骤如下:
// 快速排序算法
void QuickSort(int *arr, int left, int right) {
if (left >= right) return; // 递归终止条件:待排序区间只有一个元素
int i = left, j = right, pivot = arr[left]; // 选择左侧元素为基准
while (i < j) {
while (i < j && arr[j] >= pivot) j--; // 从右向左扫描,找到第一个小于基准的位置
if (i < j) arr[i++] = arr[j]; // 将该元素放到左侧
while (i < j && arr[i] < pivot) i++; // 从左向右扫描,找到第一个大于等于基准的位置
if (i < j) arr[j--] = arr[i]; // 将该元素放到右侧
}
arr[i] = pivot; // 将基准元素放到中间
QuickSort(arr, left, i - 1); // 递归左侧区间
QuickSort(arr, i + 1, right); // 递归右侧区间
}
// 堆排序算法
void HeapSort(int *arr, int n) {
// 1. 构建大根堆
for (int i = n / 2 - 1; i >= 0; i--) { // 从最后一个非叶子节点向上遍历
Heapify(arr, n, i);
}
// 2. 每次取出堆顶元素(最大值),并调整成新的堆
for (int j = n - 1; j >= 0; j--) {
int temp = arr[0];
arr[0] = arr[j];
arr[j] = temp; // 堆顶元素与末尾元素交换
Heapify(arr, j, 0); // 调整成新的堆
}
}
// 调整以i为根节点的大根堆
void Heapify(int *arr, int n, int i) {
int largest = i; // 初始化最大值为根节点
int left = 2 * i + 1;
int right = 2 * i + 2;
if (left < n && arr[left] > arr[largest]) largest = left; // 左孩子比根节点大
if (right < n && arr[right] > arr[largest]) largest = right; // 右孩子比根节点大
if (largest != i) { // 如果根节点不是最大值,则交换位置,并调整成新的堆
int temp = arr[i];
arr[i] = arr[largest];
arr[largest] = temp;
Heapify(arr, n, largest);
}
}
除了以上三种排序算法之外,还有许多其他的排序算法(如归并排序、计数排序等),您可以根据实际情况选择合适的算法。不过基本思想都是一致的:将待排序序列进行分割,通过比较和交换操作将其变成有序序列。希望以上内容能够帮到您解决问题,如有疑问还请随时联系我。