简单排序。内嵌一个sort函数,不需要写,但是需要c++调用头文件
#include <iostream>
#include "algorithm"
using namespace std;
const int MAXN=1000;
int arr[MAXN];
int main() {
int n;
while (scanf("%d",&n)!=EOF){
for (int i = 0; i <n ; ++i) {
scanf("%d",&arr[i]);
}
sort(arr,arr+n);//一个个是其实地址,第二个参数是终止地址。集成了快速排序的算法
for (int i = 0; i <n ; ++i) {
printf("%d\n",arr[i]);
}
}
return 0;
}
#include <iostream>
#include "algorithm"//使用sort函数一定要加这个
using namespace std;
const int MAXN=1000;
int arr[MAXN];
struct student{
int code;
int number;
};
student arry[100];
bool comper(student x,student y){
if (x.code==y.code){
return x.number<y.number;//这里表示返回学号小的,就是说学号小的排前面
} else{
return x.code<y.code;//这里表示返回成绩小的
}
}
int main() {
int n;
scanf("%d",&n);
for (int i = 0; i <n ; ++i) {
scanf("%d %d",&arry[i].number,&arry[i].code);
}
sort(arry ,arry+n,comper);
for (int i = 0; i <n ; ++i) {
printf("%d %d\n",arry[i].number,arry[i].code);
}
return 0;
}
两个数组拼接的方法
#include <iostream>
#include "algorithm"
using namespace std;
bool comper(int x,int y ){
return x>y;
}
int main() {
int n=10;
int host[10];
for (int i = 0; i <n ; ++i) {
scanf("%d",&host[i]);
}
int JS=0;
int OS=0;//记录奇数与偶数个数
int jishu[10];
int oushu[10];
for (int i = 0; i < n; ++i) {
if (host[i]%2==0){//偶数
oushu[OS]=host[i];
OS++;
} else{
jishu[JS]=host[i];
JS++;
}
}
sort(jishu,jishu+JS,comper);
sort(oushu,oushu+OS);
int k;//利用k来做导向
for (k=0;k< JS;k++) {
host[k]=jishu[k];
}
for (int i = 0; i < OS; ++i) {
host[k]=oushu[i];
k++;
}
for (int i = 0; i < n; ++i) {
printf("%d ",host[i]);
}
return 0;
}
#include <iostream>
#include "algorithm"
using namespace std;
const int MAXN=1000;
int arr[MAXN];
struct student{
int code;
int number;
};
student arry[100];
/* bool comper(student x,student y){
if (x.code==y.code){
return x.number<y.number;
} else{
return x.code<y.code;
}
}*/
bool comper(int x,int y ){
if (x%2==1&&y%2==1){
return x>y;//都是奇数的话,以大到小的方式
} else if (x%2==0&&y%2==0){
return x<y;//都是偶数的话,以小到大的方式
}else if (x%2==1&&y%2==0){
return true;//x是奇数,y是偶数的话。那么x排在前面(true)就是表示小到大排序
} else return false;//x是偶数的话,x就排在后面
}
int main() {
int n=10;
int host[10];
for (int i = 0; i <n ; ++i) {
scanf("%d",&host[i]);
}
sort(host,host+n, comper);
for (int i = 0; i <n ; ++i) {
printf("%d ",host[i]);
}
return 0;
}
——————————————————————————————————————
————————————————————————————————————————
逆序数
#include <iostream>
using namespace std;
const int MAXN=1000;
int temp[MAXN];
int aryy[MAXN];
int number=0;
int guibing( int left,int middle,int right){
int i=left;
int j=middle+1;
int k=left;
while (i<=middle&&j<=right){
for(k=left;k<=right;k++){
temp[k]=aryy[k];
}
for (k=i;i<=middle&&j<=right;k++){
if(temp[i]<= temp[j])
aryy[k]=temp[i++];
else{
aryy[k]=temp[j++];
number=number+middle+1-i;//这里是最重要的逆序数计算公式
}
}
while (i<=middle) aryy[k++]=temp[i++];
while (j<=right) aryy[k++]=temp[j++];
}
}
int merge(int left,int right){
if (left<right){
int middle=(left+right)/2;
merge(left,middle);
merge(middle+1,right);
guibing(left,middle,right);
}
}
int main() {
int n;
scanf("%d",&n);
for (int i = 0; i <n ; ++i) {
scanf("%d",&aryy[i]);
}
merge(0,n-1);
for (int i = 0; i <n ; ++i) {
printf("%d",aryy[i]);
}
printf("\n%d",number);
return 0;
}
第二题逆序数
——————————————————————————————————————————————————
#include <iostream>
using namespace std;
const int MAXN=1000;
int temp[MAXN];
int aryy[MAXN];
int number=0;
int guibing( int left,int middle,int right){//
int i=left;
int j=middle+1;
int k=left;
while (i<=middle&&j<=right){
for(k=left;k<=right;k++){
temp[k]=aryy[k];
}
for (k=i;i<=middle&&j<=right;k++){
if(temp[i]<= temp[j])
aryy[k]=temp[i++];
else{
aryy[k]=temp[j++];
number=number+middle+1-i;//逆序数计算,最重要
}
}
while (i<=middle) aryy[k++]=temp[i++];
while (j<=right) aryy[k++]=temp[j++];
}
}
int merge(int left,int right){
if (left<right){
int middle=(left+right)/2;
merge(left,middle);
merge(middle+1,right);
guibing(left,middle,right);
}
}
int main() {
int order;
scanf("%d",&order);
for(int ordernum=1;ordernum<=order;ordernum++) {//就在这层多了一个for循环一个大数组而已
int n;
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
scanf("%d", &aryy[i]);
}
merge(0, n - 1);
/*for (int i = 0; i < n; ++i) {
printf("%d", aryy[i]);
}*/
printf("Scenari#%d",ordernum);
printf("\n%d", number);
}
return 0;
}
这里采用了nlogn的大小,先排序再找a[n-k]
#include <iostream>
using namespace std;
const int MAXN=1000;
int temp[MAXN];
int aryy[MAXN];
int number=0;
int guibing( int left,int middle,int right){
int i=left;
int j=middle+1;
int k=left;
while (i<=middle&&j<=right){
for(k=left;k<=right;k++){
temp[k]=aryy[k];
}
for (k=i;i<=middle&&j<=right;k++){
if(temp[i]<= temp[j])
aryy[k]=temp[i++];
else{
aryy[k]=temp[j++];
number=number+middle+1-i;//逆序数计算,最重要
}
}
while (i<=middle) aryy[k++]=temp[i++];
while (j<=right) aryy[k++]=temp[j++];
}
}
int merge(int left,int right){
if (left<right){
int middle=(left+right)/2;
merge(left,middle);
merge(middle+1,right);
guibing(left,middle,right);
}
}
int partition(int left,int right){
int temp=aryy[left];
if (left<right){
while (left<right&&aryy[right]>=temp){
right--;
}aryy[left]=aryy[right];
while (left<right&&aryy[left]<=temp){
left++;
}aryy[right]=aryy[left];
}
aryy[left]=temp;
return left;
}
/*void QSort(int left,int right){//这个是原版
if (left<right){
int pivot= partition(left,right);
QSort(left,pivot-1);
QSort(pivot+1,right);
}
}*/
int QSort(int left,int right,int p){//p需要求哪个位置
if (left<right){
int privot= partition(left,right);
if (privot>p){//向左边找
return QSort(left,privot-1,p);
} else if (privot<p){
return QSort(privot+1,right,p);
} else
return aryy[privot];
}
}
int main() {
int n;
int k;
scanf("%d %d",&n,&k);
for(int i=0;i<n;i++){
scanf("%d",&aryy[i]);
}
int anser=QSort(0,n-1,n-k);
for(int i=0;i<n;i++){
printf("%d ",aryy[i]);
}
// printf("\n%d",aryy[n-k]);//输出第k大
printf("\n%d",anser);
return 0;
}
冒泡算法
#include <iostream>
using namespace std;
const int MAXN=1000;
int arr[MAXN];
void bubble_sort(int len) {
int i, j, temp;
for (i = 0; i < len - 1; i++)
for (j = 0; j < len - 1 - i; j++)//要注意这里是lent-1-i;
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
int main() {
int n;
int i ;
scanf("%d",&n);
for ( i = 0; i <n ; ++i) {
scanf("%d",&arr[i]);
}
bubble_sort(n);
for ( i=0;i<n;i++){
printf("%d ",arr[i]);
}
return 0;
}