int a[5] = {2,3,4,1,5} ;
bool cmp(int a, int b){
return a>b;
}
int main(){
//复杂度是O(nlog(n))
sort(a+0, a+5, greater<int>() ) ; //系统的排序函数
sort(a+0, a+5, cmp ) ; //自定义函数cmp
//reverse(a+0, a+5) ;//逆序
for(int i=0; i<5; i++){
cout << a[i] << " " ;
}
return 0;
}
冒泡排序
int a[5] = {3,2,1,5,4} ;
// 3,2,1,5,4
int main(){
int n = 5;
int tot = 0;//记录交换的次数
//冒泡排序
for(int i=0; i<n-1; i++){
for(int j=0; j<n-1-i; j++){
if(a[j] > a[j+1]) swap(a[j], a[j+1]) , tot = tot + 1;
}
}
//比较次数? = (n-1) + (n-2) + (n-3) +...+1 = n*(n-1)/2
//复杂度是O(n^2)
//需要交换几次? = 原来数组中逆序对的对数
cout << tot << "\n" ;
for(int i=0; i<5; i++){
cout << a[i] << " " ;
}
return 0;
}
//改进版 //复杂度是O(n^2)
bool flag = true;
int k = n;
while(flag){
flag = false;
for(int j=0; j<k-1; j++){
if(a[j] > a[j+1]) swap(a[j], a[j+1]) , flag = true;
}
k --;
}
//加入保存最右端的交换位置pos //复杂度是O(n^2)
#include<bits/stdc++.h>
using namespace std ;
int a[5] = {2,1,4,3,5} ;
int main(){
int n = 5;
int pos; // 记录最后交换的位置
for (int i = 0; i < n - 1; ++i) {
bool flag = false;
pos = 0; // 重置 pos
for (int j = 0; j < n - 1 - i; ++j) {
if (a[j] > a[j + 1]) {
// 交换元素
swap(a[j], a[j + 1]);
flag = true;
pos = j; // 更新 pos 为最后交换的位置
}
}
if (!flag) {
break; // 如果没有发生交换,数组已经排序完成
}
for (const auto& i : a) {
std::cout << i << " ";
}
}
return 0;
}
插入排序 //复杂度是O(n^2)
//插入Insert sort
int n = 5;
for(int i=1; i<n; i++){
int vip = a[i] ;//
int j = i-1;
while(a[j] > vip && j>=0){
a[j+1] = a[j] ;
j --;
}
a[j+1] = vip ;
}
for(auto i : a){
cout << i << " ";
}
//选择排序 selection sort //复杂度是O(n^2)
int n = 5;
for(int i=0; i<n; i++){
int k = i;
for(int j=i+1; j<n; j++){
if (a[j] < a[k]) k = j ;
}
if(k != i) {
swap(a[k] , a[i]) ;
}
}
计数排序
int n =5;
//计数排序
for(int i=0; i<n; i++){
train[ a[i] ] ++;
}
for(int i=0; i<100; i++){
if(train[i]){
for(int j=0; j< train[i]; j++){
cout << i << " ";
}
}
}
—— 本文来自火龙信奥(义乌睿码科技):义乌青少年信息学奥赛与编程教育平台,专注 CSP-J/S、NOIP、GESP 竞赛培训,线上线下融合教学,助力编程升学。网址:hlcoding.com