普通排序(适合n在2000以内的题目)
#include<stdio.h>
int main(){
int n,a[100];
scanf("%d",&n); //输入要排序的数的个数
for(int i=0; i<n; i++)
scanf("%d",&a[i]); //输入排序的数
for(int i=0; i<n; i++){ //排序(从小到大)
for(int j=0; j<n-1; j++){ //最后一个不用自己给自己比,所以是n-1
if(a[j]>a[j+1]){
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
for(int i=0; i<n; i++)
printf("%d ",a[i]);
return 0;
}
快速排序(适合n在50w以内排序,时间复杂度nlogn)
#include<bits/stdc++.h>
using namespace std;
//字符数组可以写成char* functionname(char a[]){ }
void QuickSort(int a[], int left, int right){
if(left<right){
int i=left, j=right, key=a[left];
while(i<j){
while(i<j && a[j]>key){
j--;
}
if(i<j){ //a右半段数比key小
a[i++]=a[j];
}
while(i<j && a[i]<key){
i++;
}
if(i<j){ //a左边的数比key大
a[j--]=a[i];
}
}
a[i]=key; //中枢元素,已定
QuickSort(a,left,i-1); //左半段继续排序
QuickSort(a,i+1,right); //右半段继续排序
}
}
int main(){
int a[100],n=0,b;
while(cin>>b){ //输入数组元素
a[n++]=b;
if(cin.get()=='\n') break;
}
QuickSort(a,0,n-1); //快排函数
for(int i=0; i<n; i++){ //输出数组元素
cout<<a[i]<<" ";
}
return 0;
}
冒泡排序
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[100],n=0,b;
while(cin>>b){ //输入数组元素
a[n++]=b;
if(cin.get()=='\n') break;
}
for(int i=0; i<n-1; i++){ //排序趟数
for(int j=0; j<n-i-1; j++){ //一个元素与其他排序
if(a[j]>a[j+1]){
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
for(int i=0; i<n; i++){ //输出数组元素(从小到大)
cout<<a[i]<<" ";
}
return 0;
}
排序小结
-
稳定的排序算法:基数排序、冒泡排序、直接插入排序、归并排序。
-
时间复杂度为O(nlogn):快速排序、堆排序、归并排序。
-
时间复杂度为O(n^2):直接插入排序、冒泡排序、简单选择排序。