浅谈简化版排序

来源:互联网 发布:1099端口被占用 编辑:程序博客网 时间:2024/06/05 07:58

排序


最近,粗略的学习了算法的入门小白级算法书,《啊哈!算法》,作为一个算法小白,不得不说这本书写得及其浅显易懂,果真是为完全小白准备的。之前没有接触过算法的任何学习,现在简单的分享一下自己关于排序算法的一点收获,各位算法大神请绕道,谢谢。


桶排序

排序,我将它理解为将一组无序数据按一定的方式排列为有序的数据。而桶排序,是一种比较简单粗暴的方式吧。

这个讲的就是将类似于【4,5,2,5,1】这样的数字排序的话,我们选用数组来完成排序。我们将数组的下标当做要排序的数的更大的一个集合,而数组初始化值为零,当有下标值得数出现时,将数组的值加1。数组的值表示数据出现的次数,在需要输出时,将相应的数据输出。

用一个book[6]数组进行排序,将各个数据出现次数存入,在需要输出时,按照数组值表示的个数来输出就好。

实现代码:

#include <stdio.h>int main(){   int book[6],i,j,t;   //初始化   for(i=0;i<=6;i++)       book[i]=0;   //开始排序   for(i=1;i<=5;i++)   {       scanf("%d",&t);//读入数据       book[t]++;//进行计数   }   //排序结束   //如需要输出,则,   for(i=1;i<=5;i++)       for(j=1;j<=book[i];j++)//出现几次打印几次           printf("%d",i);   getchar();getchar();//暂停程序,查看输出return 0;}

桶排序的时间复杂度是O(m+n),时间上非常快,不过,当数据跨度较大时,浪费的空间会很多。也就是以空间的牺牲换取时间。所以桶排序适合数据比较接近的数据,空间利用会比较好。


冒泡排序

记得冒泡排序是最开始在学习C语言的时候接触到的,当时画了多少工夫才理解,确实比较笨。冒泡排序的思想是:每次比较两个相邻元素,如果他们的顺序错误,就把它们交换过来。

冒泡排序的原理是,每次只能有一个数归位,它的实现过程,是将相邻的两个数进行比较,将较大或较小的那个数(取决于你要怎样排序)放在相应的位置,进过一轮之后,会将最大或者最小的那个数放在最后,第二次会确定倒数第二位上的数……以此类推,知道n-1轮之后,所有的数按照一定的顺序排好。

实现代码:

#include <stdio.h>int main(){    int a[100],t,n,i,j;    scanf("%d",&n);    for(i=1;i<=n;i++)        scanf("%d",&a[i]);//读入n个数到数组中    //开始排序    for(i=1;i<n-1;i++)        for (j=1;j<n;j++)        {            if (a[j]<a[j+1]) //比较大小,此处按照从大到小排序            {                t=a[j];                a[j]=a[j+1];                a[j+1]=t;            }        }    //排序结束    //若需要输出结果,则,        for(i=1;i<=n;i++)            printf("%d ",a[i]);   getchar();getchar();   return 0;} 

冒泡排序的核心在于双重嵌套循环,时间复杂度为O(N^2)。时间复杂度非常高,各大改进也没有什么突破性的进展。


快速排序

桶排序在时间复杂度上非常好,但空间浪费严重;冒泡排序在空间上及其节约,只需要数据存放的空间就可以,不需要为排序新开辟空间,但时间复杂度非常高。而快速排序可以既不浪费空间也可以节约时间。

快速排序是基于“二分”的思想,方法是设定一个基准数(默认我们使用第一个数,比较方便)从序列两边开始查找,(这里我们假设从小到大排序,从大到小就是找数时放的与基准数的大小反过来)从左向右找小于基准数和大于基准数的两个数交换位置,直到相遇是停止,停止数与基准数交换位置。以基准数为分界点,分别对前后两段序列进行重复操作。(此时可以使用递归)

实现代码:

#include <stdio.h>int a[101],n;  //定义全局变量在两个函数中使用void quicksort(int left, int right){    int i,j,t,temp;    if(left>right)        return;    temp=a[left];    i = left;    j = right;    while(i!=j)    {        //一定要先从右往左找        while(a[j]>=temp && i<j)            j--;        while(a[i]<=temp &&i<j)            i++;        //交换两数的位置        if(i<j)        {            t=a[i];            a[i]=a[j];            a[j]=t;        }    }    //将基准数归位    a[left]=a[i];    a[i]=temp;    quicksort(left,i-1);//递归继续处理左边的序列    quicksort(i+1,right);//递归继续处理右边的序列    return;}//主函数int main(){    int i;    scanf("%d",&n);    for(i=1;i<=n;i++)        scanf("%d",&a[i]);//读入n个数到数组中    quicksort(1,n);//快速排序调用    //若需要输出结果,则,    for(i=1;i<=n;i++)         printf("%d ",a[i]);    getchar();getchar();    return 0;}

暂时就这么多啦,持续更新中……

原创粉丝点击