1.桶排序:时间复杂度为 O(m+n)。------浪费空间
#include<iostream> using namespace std; void Tong(int* a,int len) //桶排序 { int t[1001]={0}; for(int i=0;i<len;i++) t[a[i]]++; for(int i=1;i<=1000;i++) //这里的i需要包含len结束,因为如果未算到len(i<len),那么只能算到9,数据排序会少了一位 { for(int j=1;j<=t[i];j++) cout<<i<<endl; } } int main() { int a[10]={99,1,2,7,8,3,4,24,10,8}; Tong(a,10); }
1 void Tong(int* a,int len) //桶排序 2 { 3 int t[1001]={0}; 4 for(int i=0;i<len;i++) 5 t[a[i]]++; 6 for(int i=1;i<=1000;i++) 7 { 8 for(int j=1;j<=t[i];j++)//打印t[i]个i 9 cout<<i<<endl; 10 } 11 }
2.冒泡排序:从大到小排序 时间复杂度是 O(N^2)。---------浪费时间
基本思想是:每次比较两个相邻的元素,如果它们的顺序错误就把它们交换 过来。
代码:
#include<iostream> using namespace std; struct Student{ string name; int score; }; void swap(Student &a,Student &b) { int t=a.score; a.score=b.score; b.score=t; string m=a.name; a.name=b.name; b.name=m; } void maopao(Student* a,int len) //冒泡排序 { for(int i=0;i<len-1;i++) { for(int j=0;j<len-i;j++) if(a[j].score<a[j+1].score) //相邻交换 swap(a[i],a[j]); } for(int i=0;i<len;i++) { cout<<a[i].name<<" "<<a[i].score<<endl; } } int main() { Student a[5]; for(int i=0;i<5;i++) cin>>a[i].name>>a[i].score; maopao(a,5); }
1 for(int i=0;i<len-1;i++) //只需进行n-1次排序 2 { 3 for(int j=0;j<len-i;j++) 4 if(a[j].score<a[j+1].score) //相邻交换 5 swap(a[i],a[j]); 6 }
3.快排序——基于一 种叫做“二分”的思想
快速排序的差时间复杂度和 冒泡排序是一样的,都是 O(N2),它的平均时间复杂度为 O (NlogN)。
#include<iostream> using namespace std; int a[101],n;//定义全局变量 void swap(int &x,int &y) { int t; t=x,x=y,y=t; } void qsort(int left,int right) { int i=left,j=right,temp=a[left]; if(left>right) return; while(i!=j) { //注明顺序很重要,先写j的方向,再写i的方向 while(a[j]>=temp&&j>i) j--; while(a[i]<=temp&&j>i) i++; if(i<j) swap(a[j],a[i]); } if(i==j) swap(a[i],a[left]); qsort(left,i-1); qsort(i+1,right); } int main() { cin>>n; for(int i=0;i<n;i++) cin>>a[i]; qsort(0,n-1); for(int i=0;i<n;i++) cout<<a[i]<<" "; }
1 void qsort(int left,int right) 2 { 3 int i=left,j=right,temp=a[left]; 4 if(left>right) 5 return; 6 while(i!=j) 7 { 8 //注明顺序很重要,先写j的方向,再写i的方向 9 while(a[j]>=temp&&j>i) 10 j--; 11 while(a[i]<=temp&&j>i) 12 i++; 13 if(i<j) 14 swap(a[j],a[i]); 15 } 16 if(i==j) 17 swap(a[i],a[left]); 18 19 qsort(left,i-1); 20 qsort(i+1,right); 21 }
有计数排序、基数排序、插入排序、归并排序和堆排序等等
4.计数排序
计数排序是一种非常快捷的稳定性强的排序方法
时间复杂度O(n+k),其中n为要排序的数的个数,k为要排序的数的最大值。
计数排序对一定量的整数排序时候的速度非常快,一般快于其他排序算法。
但计数排序局限性比较大,只限于对整数进行排序。
计数排序是消耗空间发杂度来获取快捷的排序方法,其空间发展度为O(K)同理K为要排序的最大值。
使用到3个数组,A,B,C
A数组:保存未排序的数据
B数组:保存每个数有多少个比它小的数,也就是每个数的位置
C数组:保存排序完的数据
步骤:
1.为A数组赋值,找出max (0,n-1)
2.为B数组进行桶赋值(值为数据),b[a[i]]++; (0,max)
3.为B数组赋值(值为位置):b[i]=b[i]+b[i-1]; (1,n-1)
4.为C数组赋值:b[a[i]]--; c[b[a[i]]=a[i] ;(0,n-1) // a[i]为数据值,b[a[i]]为a[i]前面包括自己有多少个数字的个数(即pos-1);
5.输出C数组(排序结果)
#include<iostream> using namespace std; int maxn=0; void jishusort(int *a,int len) { int b[1001]={0}; int c[maxn+1]; for(int i=0;i<len;i++) b[a[i]]++; for(int i=1;i<=maxn;i++) b[i]=b[i-1]+b[i]; for(int i=0;i<len;i++) { b[a[i]]--; c[b[a[i]]]=a[i]; } for(int i=0;i<len;i++) cout<<c[i]<<" "; } int main() { int a[1000]; int n; cin>>n; for(int i=0;i<n;i++) { cin>>a[i]; if(a[i]>maxn) maxn=a[i]; } jishusort(a,n); }
1 void jishusort(int *a,int len) 2 { 3 int b[1001]={0}; 4 int c[maxn+1]; 5 for(int i=0;i<len;i++) 6 b[a[i]]++; 7 for(int i=1;i<=maxn;i++) 8 b[i]=b[i-1]+b[i]; 9 for(int i=0;i<len;i++) 10 { 11 b[a[i]]--; 12 c[b[a[i]]]=a[i]; 13 } 14 for(int i=0;i<len;i++) 15 cout<<c[i]<<" "; 16 }
5.基数排序(我觉得也可称为利用位数排序)
#include <iostream> using namespace std; int maxn = 0; void RadixSortLSD(int *a,int n) //位数排序 { int pos=1; while(maxn/pos>0) { int b[10]={0}; int c[n]; for(int i=0;i<n;i++) b[a[i]/pos%10]++; for(int i=1;i<10;i++) b[i]=b[i]+b[i-1]; for(int i=n-1;i>=0;i--) //注意这里是从尾到头 c[--b[a[i]/pos%10]]=a[i]; for(int i=0;i<n;i++) a[i]=c[i]; pos*=10; } for(int i=0;i<n;i++) cout<<a[i]<<" "; } int main() { int n; cin>>n; int a[n]; for(int i=0;i<n;i++) { cin>>a[i]; if(maxn<a[i]) maxn=a[i]; } RadixSortLSD(&a[0],n); return 0; }
1 void RadixSortLSD(int *a,int n) //位数排序 2 { 3 int pos=1; 4 while(maxn/pos>0) 5 { 6 int b[10]={0}; 7 int c[n]; 8 for(int i=0;i<n;i++) 9 b[a[i]/pos%10]++; 10 for(int i=1;i<10;i++) 11 b[i]=b[i]+b[i-1]; 12 for(int i=n-1;i>=0;i--) //注意这里是从尾到头 13 c[--b[a[i]/pos%10]]=a[i]; 14 for(int i=0;i<n;i++) 15 a[i]=c[i]; 16 pos*=10; 17 } 18 for(int i=0;i<n;i++) 19 cout<<a[i]<<" "; 20 }
位数排序:对数组分别从个位,十位,百位...进行排序
步骤:
1.先找出数组最大数的位数h,通过找到最大数,循环h次排序 while(maxn/pos>0)
排序中的步骤: {53, 3, 542, 748, 14, 214, 154, 63, 616}
a数组是将要排序的一组数
假设t是比较某位(个位、十位、百位、千位等)时a[i]数的该位上的值(范围0到9) 该数中某位(个十百千位)的值
b数组是t的位置 b[t] 值是排序数在位排序时的位置,t是该位上的值(比如第一个数53在个位排序时 t=3,b[t]=2(前面有一个542))
c数组是暂放位排序数组的排序数组
2.(0,n-1)循环b[a[i]/pos%10]++; //a[i]/pos%10就是t 先存t值
3.(0,9)循环b[i]=b[i]+b[i-1] //再存t的位置 比i小和等于的数为本身加前面的数
4.(n-1,0)c[]暂放位排序数组 c[--b[a[i]/pos%10]]=a[i] //t=a[i]/pos%10 b[t]是t的位置,但是t位值可以存在重复的,所以--t为位置
6.堆排序
7.插入排序
8.并排序
原文:https://www.cnblogs.com/Aiahtwo/p/10547329.html