C++程序题结构体和sort排序问题E:进步最快

C++程序题结构体和sort排序问题E:进步最快,第1张

我平时有刷类似算法题,如图leetcode上我的记录。此题的思想很简单:原编号就是原排名,自己写个比较函数用sort进行索引排序!这样就能轻松比较排名变化。

程序如下,有详细注释

#include<stdioh>

#include<iostream>

#include<vector>

#include<algorithm>

using namespace std;

typedef union G_sort{

char grade[4];

int id;

}G_sort;

bool greater(const G_sort &a, const G_sort &b) {

return agrade[3] > bgrade[3]; //成绩(高8位)

}

int main() {

//输入

int n; cin >> n; //第一行一个整数n,表示学生总数。

vector<G_sort> grade(n); //表示每个学生的  编号(高24位)|成绩(低8位)

for (int i = 0; i < n; i++) { //n ≤ 100, 000

scanf("%d", &grade[i]grade[3]); //成绩(高8位)

//cin >> grade[i]grade[3]; ★这种输入会出错

grade[i]id |= i; //编号(低24位)

}

//排序

sort(gradebegin(), gradeend(), greater); //根据学号排序

int d_sort = 0, now_sort;//排名上升多少,现排名

for (int i = 0; i < n; i++) {

int d = (grade[i]id & 0xffffff) - i; //原排名-现排名

if (d > d_sort) { //若两位同学名次上升幅度相同,输出名次靠前的,也就是编号较小的。(不能取=)

d_sort = d;

now_sort = i + 1; //注意!下标从0数起 比排名少1

}

}

//输出

/

 //16进制查看 grade 数据

for (int i = 0; i < n; i++) {

printf("%x\n", grade[i]id);

}/

cout << now_sort << endl << now_sort+ d_sort << endl;

system("pause");

return 0;

}

写了两段代码,第一个是用冒泡排序法做的,第二个是快速排序法

#include <iostream>

using namespace std;

//冒泡排序法

template<typename T>

void sort(T data, int n)

{

int i, j;

T hold;

for (i = 0; i < n - 1; i++)

{

for (j = 0; j < n -1; j++)

{

if (data[j] > data[j+1])

{

hold = data[j];

data[j] = data[j+1];

data[j+1] = hold;

}

}

}

}

int main()

{

int i;

int a[] = {3, 2, 1, 5, 8 ,7};

char b[] = {'b', 'c', 'a', 'p', 'g'};

double c[] = {12, 21, 11, 10};

sort(a, 6);

for (i = 0; i < 6; i++)

cout << a[i] << " ";

cout << endl;

sort(b, 5);

for (i = 0; i < 5; i++)

cout << b[i] << " ";

cout << endl;

sort(c, 4);

for (i = 0; i < 4; i++)

cout << c[i] << " ";

cout << endl;

return 0;

}

#include <iostream>

using namespace std;

//快速排序法

template<typename T>

void Quick_sort(T data_ptr, int left, int right)

{

int low(left), high(right);

T middle, temp;

middle = data_ptr[(rand()%(right - left + 1)) + left]; //随机产生一个大于等于left且小于等于right的数

do{

while ((data_ptr[low] < middle) && (low < right)) //左扫面找出大于middle的数

low++;

while ((data_ptr[high]) > middle && (high > left)) //右扫面找出小于middle的数

high--;

//数据交换

if (low <= high)

{

temp = data_ptr[low];

data_ptr[low] = data_ptr[high];

data_ptr[high] = temp;

low++;

high--;

}

}while(low <= high); //当下标交错时停止,结束一次排序

//当左边有部分值的时候(left<high),递归左边

if (left < high)

Quick_sort(data_ptr, left, high);

//当右边有部分值的时候(right > low),递归右边

if (right > low)

Quick_sort(data_ptr, low, right);

}

int main()

{

int i;

int a[] = {3, 2, 1, 5, 8 ,7};

char b[] = {'b', 'c', 'a', 'p', 'g'};

double c[] = {12, 21, 11, 10};

Quick_sort(a, 0, 5);

for (i = 0; i < 6; i++)

cout << a[i] << " ";

cout << endl;

Quick_sort(b, 0, 4);

for (i = 0; i < 5; i++)

cout << b[i] << " ";

cout << endl;

Quick_sort(c, 0, 3);

for (i = 0; i < 4; i++)

cout << c[i] << " ";

cout << endl;

return 0;

}

我给你所有的算法,你自己去组合一下就好了。。 1直接插入排序:算法:void InsSort(RecordType r[], int length) / 对记录数组r做直接插入排序,length为数组中待排序记录的数目/ { int i,j; for (i=2; i<=length; i++) { r[0]=r[i]; /将待插入记录存放到监视哨r[0]中/ j=i-1; while (r[0]key< r[j]key ) / 寻找插入位置 / { r[j+1]= r[j]; j=j-1; } r[j+1]=r[0]; /将待插入记录插入到已排序的序列中/ } } / InsSort / 2冒泡排序:算法:void BubbleSort(RecordType r[], int length ) /对记录数组r做冒泡排序,length为数组的长度/ { int n,i,j; int change; RecordType x; n=length; change=TRUE; for ( i=1 ; i<= n-1 && change ;++i ) { change=FALSE; for ( j=1 ; j r[j+1]key ) { x= r[j]; r[j]= r[j+1]; r[j+1]= x; change=TRUE; } } } / BubbleSort / 3快速排序:算法:void QKSort(RecordType r[],int low, int high ) /对记录数组r[lowhigh]用快速排序算法进行排序/ { int pos; if(low

Private SubCommand1_Click()Dim a(), n AsIntegern = 10ReDim a(n)For i = 1 To n a(i) = Int(Rnd 100)NextCall Sort(a, n)For i = 1 To n Print a(i)NextEnd Sub Sub Sort(ByRef a,n As Integer)Dim i, j, x AsIntegerFor i = 1 To n For j = i + 1 To n If a(i) > a(j) Then x = a(i) a(i) = a(j) a(j) = x End If NextNextEnd Sub

使用sort()函数在做简单排序算法时候是非常好的方法。

sort(buffer,buffer+n,cmp); buffer为待排序数组的首地址,buffer+n为待排序数组的最后一个数据的地址。cmp为自定义的排序规则函数,可省略。

sort()函数默认是为升序排列,允许排序类型包括数值/字符/字符串。sort()也可以对结构体进行排序。

cmp函数的返回值为true和false或1和0,若为true/1,则sort()函数为升序排列,若为false/0,则sort()函数为降序排列。

下面为一个找出奶牛产奶量中间值的小程序,举例说明:

#include "iostream"

#include "algorithm"

using namespace std;

//奶牛结构类

typedef struct  

{

 int milk;

 int num;

}COW;

COW cow[100];

bool cmp(COW A, COW B);

//主函数

void main()

{

 

 int n;

 cout<<"请输入奶牛的数量:  ";

 cin>>n;

 for(int i=1;i<=n; i++)

 {

  cout<<"请输入奶牛"<<i<<"的产奶量:  ";

  cin>>cow[i-1]milk;

  cow[i-1]num = i;

 }

 sort(cow,cow+n,cmp); //排序比较

 cout<<"中间奶牛产奶量为:  "<<cow[n/2]milk<<endl;

 system("pause");

}

//cmp排序规则函数

bool cmp(COW A, COW B)

{

 if (Amilk < Bmilk)  //按产奶量由小到大排序

 {

  return true;

 }

 else if (Amilk == Bmilk)

 {

  if (Anum > Bnum)  //产奶量相同时,按序号由大到小排序

  {

   return true;

  }

  return false;

 }

 else

 {

  return false;

 }

}

以上就是关于C++程序题结构体和sort排序问题E:进步最快全部的内容,包括:C++程序题结构体和sort排序问题E:进步最快、编一个C++程序 创建一个选择排序法的函数模板sort 并在main()执行、函数insertsort使用直接插入排序法对n个数据进行升序排序,请将程序补充完整。 void i等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10175317.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-06
下一篇2023-05-06

发表评论

登录后才能评论

评论列表(0条)

    保存