排序
时间:2022-05-05
本文章向大家介绍排序,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
排序法 |
平均时间 |
最差情形 |
稳定度 |
额外空间 |
---|---|---|---|---|
冒泡 |
O(n2) |
O(n2) |
稳定 |
O(1) |
交换 |
O(n2) |
O(n2) |
不稳定 |
O(1) |
选择 |
O(n2) |
O(n2) |
不稳定 |
O(1) |
插入 |
O(n2) |
O(n2) |
稳定 |
O(1) |
基数 |
O(logRB) |
O(logRB) |
稳定 |
O(n) |
Shell |
O(nlogn) |
O(ns) 1<s<2 |
不稳定 |
O(1) |
快速 |
O(nlogn) |
O(n2) |
不稳定 |
O(nlogn) |
归并 |
O(nlogn) |
O(nlogn) |
稳定 |
O(1) |
堆 |
O(nlogn) |
O(nlogn) |
不稳定 |
O(1) |
插入排序:
1 #include<stdio.h>
2 //╡ЕхКеепР
3 template<class T1 ,class T2>
4 void Isort(T1 *arg , T2 len){
5
6 T2 i,j;
7 for(i=1; i<len ; i++){
8 int val = arg[i];
9 for( j= i-1 ; j>=0&&val<arg[j]; j--)
10 arg[j+1]=arg[j];
11 arg[j+1]=val;
12 }
13 }
14 /*
15 template<class T1 ,class T2 ,size_t size>
16 void Isort(T1 (&arg)[size] , T2 len){
17
18 T2 i,j;
19 for(i=1; i<len ; i++){
20 int val = arg[i];
21 for( j= i-1 ; j>=0&&val<arg[j]; j--)
22 arg[j+1]=arg[j];
23 arg[j+1]=val;
24 }
25 }
26 */
冒泡排序:
1 void mPaoSort(int *arg , int len){
2 int i,j;
3 bool tag;
4 for(i=0;i<len ;i++){
5 for(j=i+1 , tag= false ;j<len ;j++){
6 if(arg[i]>arg[j]){
7 arg[i]^=arg[j];
8 arg[j]^=arg[i];
9 arg[i]^=arg[j];
10 tag=true;
11 }
12 }
13 if(!tag) break;
14 }
15 }
归并排序:
void Merge(int *A ,int ps ,int mid , int len){
int i=ps,j=mid,cnt=0;
int C[len-ps+1];
while(i<mid&&j<len ){
if(A[i]>A[j]) C[cnt++]=A[j++];
else C[cnt++]=A[i++];
}
while(i<mid) C[cnt++]=A[i++];
while(j<len) C[cnt++]=A[j++];
for(i=ps; i<len ;i++)
A[i]=C[i-ps];
}
//递归版
void Msort(int *arg ,int ps, int len){
if(ps+1<len) {
int mid = ps+((len-ps)>>1L);
Msort(arg ,ps ,mid);
Msort(arg, mid,len);
Merge(arg ,ps,mid, len);
}
}
//非递归版
void Msort_(int *arg , int ps , int len){
int s,t=1;
while(ps+t<=len){
s=t;
t=2*s;
int pos=ps;
while(pos+t<=len){
Merge(arg,pos,pos+s,pos+t);
pos+=t; //移动
}
if(pos+s<len)
Merge(arg,pos,pos+s,len);
}
if(ps+s<len)
Merge(arg,ps,ps+s,len);
}
计数排序:
1 //╪фйЩеепР
2 void JSort(int *arg , int len){
3 int ans[10]={0} ,i,j=0;
4 for(i=0; i<len ;i++)
5 ans[arg[i]]++;
6 for(j=i=0;i<10 ;i++)
7 while(ans[i]--)
8 arg[j++]=i;
9 }
桶排序:
//桶排序
#include<iostream>
#include<string.h>
typedef struct node{
int val ;
struct node * next;
void init(){
val=0;
next=NULL;
}
}Node;
void BSort(int *arg , int len , int blen ){
int i;
Node* Barry = (Node *)malloc(blen*sizeof(Node)); //定义一个二维数组
for( i=0;i<blen ;i++)
Barry[i].init();
Node *head =NULL;
for( i=0;i<len ;i++){
Node *p = (Node *)malloc(sizeof(Node));
p->val=arg[i];
p->next=NULL;
int sp = arg[i]/10;
head =&Barry[sp];
if(!head->val){
//为空,就直接将其加载到后面即可
head->next = p;
head->val=head->val+1; //统计个数
}else{
//如果不相等,选择插入排序
Node *tm=head->next ,*cur =head;
while(tm!=NULL&&tm->val<arg[i]){
cur =tm;
tm=tm->next;
}
cur->next=p ;
p->next = tm;
head->val=head->val+1;
}
}
for(int i=0; i<blen ;i++){
Node *p;
if(Barry[i].val){
p = Barry[i].next;
while(p){
printf("%d ",p->val);
p=p->next;
}
puts("");
}
}
}
int main1(int argc , char* argv[] ){
int ss[]={3,4,5,61,12,8,9,20,22,45,87};
BSort(ss ,sizeof(ss)/sizeof(int), 10);
return 0;
}
选择排序:
1 //选择排序
2 void Ssort(int *arg ,int len){
3 for(int i=0;i<len ;i++){
4 int mx=i;
5 for(int j=i+1; j<len ;j++){
6 if(arg[mx]<arg[j])mx=j;
7 }
8 if(i!=mx){
9 arg[mx]^=arg[i];
10 arg[i]^=arg[mx];
11 arg[mx]^=arg[i];
12 }
13 }
14 }
快速排序:
1 //快速排序
2 void qsort(int *arg ,int ps ,int len){
3
4 int i,j,val=arg[ps];
5 if(ps<len){
6 i=ps,j=len;
7 while(i!=j){
8 while(i<j&&arg[j]>=val) j--;
9 if(i<j) arg[i] = arg[j];
10 while(i<j&&arg[i]<=val) i++;
11 if(i<j)arg[j]=arg[i];
12 }
13 arg[i]=val;
14 qsort(arg,ps ,i-1);
15 qsort(arg,i+1,len);
16 }
17 }
堆排序:
1 //堆排序
2 void MaxHeap(int *arg ,int ps ,int len){
3 //构建一个堆
4 int cl = 2*ps , cr = 2*ps+1;
5
6 if(ps<=len/2){
7 int mx = ps; //父节点
8 if(cl<len&&arg[mx]<arg[cl]) mx = cl;
9 if(cr<len&&arg[mx]<arg[cr]) mx = cr;
10 if(mx!=ps){
11 arg[mx]^=arg[ps];
12 arg[ps]^=arg[mx];
13 arg[mx]^=arg[ps];
14 MaxHeap(arg,mx,len); //数据有改动,需要重新对改动的地方进行维护
15 }
16 }
17 }
18
19 //建立新堆
20 void Build(int *arg , int len){
21 for(int i=len/2 ; i>=1 ; i--){
22 MaxHeap(arg,i,len);
23 }
24 }
25
26 //堆排序Hsort
27 void Hsort(int *arg , int len){
28 Build(arg,len); //初始化
29 // (o(n))
30 for(int i=len ; i>1 ; i--){
31 arg[1]^=arg[i];
32 arg[i]^=arg[1];
33 arg[1]^=arg[i];
34 MaxHeap(arg,1,i);
35 }
36 }
基数排序:
1 //基数排序
2 typedef struct bas{
3 int val;
4 struct bas *next;
5 void init(){
6 val=0;
7 next=NULL;
8 }
9 }Bas;
10 void Basort(int *arg ,int len){
11 //对于数字在0-9
12 Bas *Barr[10]; //0-9
13 for(int i=0;i<10 ; i++){
14 Barr[i] = (Bas *)malloc(sizeof(Bas));
15 Barr[i]->init();
16 }
17 bool tag=false;
18 int mod =1;
19 while(1){
20 tag=false;
21 for(int i=0;i<10 ; i++)
22 Barr[i]->init();
23 for(int i=0;i<len ; i++){
24 Bas *p = (Bas *)malloc(sizeof(Bas));
25 p->val=arg[i];
26 p->next=NULL;
27 int hig =arg[i]/mod;
28 int dex = hig%10;
29 if(hig) tag=true; //只要有一位不为0,就继续
30 Bas *pb=Barr[dex];
31 while(pb->next)
32 pb = pb->next;
33 pb->next = p;
34 }
35 //将值全部放置到arg中
36 int cnt=0;
37 for(int i=0;i<10 ; i++){
38 Bas *pb = Barr[i]->next,*tm;
39 while(pb){
40 arg[cnt++]=pb->val;
41 tm=pb;
42 pb=pb->next;
43 free(tm);
44 }
45 }
46 if(!tag) return ;
47 mod*=10;
48 }
49 }
50
51 int main(){
52 int sss[]={100,123,45,67,123,1,4,5,10};
53 Basort(sss,sizeof(sss)/sizeof(int));
54 print(sss,sizeof(sss)/sizeof(int));
55 return 0;
56 }
- 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现
- 【Java数据结构学习笔记之三】Java数据结构与算法之队列(Queue)实现
- Comparison of Apache Stream Processing Frameworks: Part 2
- 2017 Multi-University Training Contest - Team 9 1005&&HDU 6165 FFF at Valentine【强联通缩点+拓扑排序】
- 2017 Multi-University Training Contest - Team 9 1004&&HDU 6164 Dying Light【数学+模拟】
- Python3选择排序
- 【DeepMind 公开课-深度强化学习教程代码实战01】迭代法评估4*4方格世界下的随机策略
- Codeforces Round #434 (Div. 2, based on Technocup 2018 Elimination Round 1)&&Codeforces 861C Did yo
- Codeforces Round #434 (Div. 2, based on Technocup 2018 Elimination Round 1)&&Codeforces 861B Which
- 信用卡安全问题:被用户忽视的识别码
- Python3快速排序
- Python3插入排序
- Python3冒泡排序
- Python Selenium设计模式-POM
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [PHP] 工厂方法设计模式-创建型设计模式
- [PHP] 对象池模式-创建型设计模式
- [PHP] 原型模式-创建型设计模式
- [PHP] 简单工厂模式-创建型设计模式
- [PHP] 单例模式-创建型设计模式
- [PHP] 静态工厂模式-创建型设计模式
- [PHP] 适配器模式-结构型设计模式
- [PHP] 使用curl扩展POST或者PUT时数据不全和连接中断的排查
- [PHP] 桥接模式-结构型设计模式
- [PHP] 组合模式-结构型设计模式
- [GO-FLY] GO-FLY客服实现浏览器消息提示音
- [PHP] 数据映射器模式-结构型设计模式
- [GO] 变参函数-GO中函数传递变长参数
- PHP+Redis 商品超卖
- Linux驱动开发入门 demo