
我平时有刷类似算法题,如图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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)