首页 > 编程语言 > 详细

排序算法总结

时间:2019-03-17 16:11:50      阅读:168      评论:0      收藏:0      [点我收藏+]

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);
 } 
View Code
 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); 
 } 
View Code
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]<<" ";
}
View Code
 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);
}
View Code
 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;
}
View Code
 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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!