关闭

基础排序算法

标签: 排序算法插入排序归并排序冒泡排序希尔排序
995人阅读 评论(2) 收藏 举报
分类:

七个基础排序算法(均为内部排序):
直接插入排序
希尔排序
冒泡排序
简单选择排序
快速排序
堆排序
二路归并排序

排序算法稳定性:经过排序后,具有相同关键码的元素之间的相对次序保持不变,则称该排序方法是稳定的;否则不稳定。

直接插入排序:

这里写图片描述

void InsertSort(int a[],int n){ // index start at 1, a[0] is temp one 
    int i,j;
    for(i=2;i<=n;i++){
        if(a[i]<a[i-1]){
            a[0]=a[i];
            a[i]=a[i-1];
        for(j=i-2;a[j]>a[0];j--){
            a[j+1]=a[j];
        }
        a[j+1]=a[0];
    }
    }
}

直接插入排序是一种稳定的排序,时间复杂度O(n^2),空间复杂度是O(1)

希尔排序:

按增量将元素分成不同的子集,对子集不断的进行插入排序。
这里写图片描述

void ShellSort(int a[],int n){ // index start at 1, a[0] is temp one 
    int d,i,j,k;
    for(d=n/2;d>=1;d>>=1){
        for(i=d+1;i<=n;i++){  // InsertSort
        if(a[i]<a[i-d]){
           a[0]=a[i];
           a[i]=a[i-d];
           for(j=i-2*d;j>0&&a[0]<a[j];j-=d){
               a[j+d]=a[j];
           }
           a[j+d]=a[0];
        }
    }
    }
}

如果a[i]>a[i-d]始终成立,那么时间是O(nlogn), 但是在糟糕的情况下是O(n^2)。空间复杂度是O(1)
希尔排序是一种不稳定的排序方法

冒泡排序:

相邻元素如果反序两两交换,直到所有的位置统统确定下来。
这里写图片描述

void BubbleSort(int a[],int n){ // index start at 1, a[0] is temp one 
    int i,j,k;
    for(i=1;i<=n;i++){
        for(j=1;j<=n-i;j++){
        if(a[j]>a[j+1]) {
            a[j]=a[j]^a[j+1];  a[j+1]=a[j]^a[j+1];   a[j]=a[j]^a[j+1];
        }
    }
    }
}

这是稳定的排序方法,时间复杂度:O(n^2)

快速排序:

选择一个轴值,使得左边的元素的值小于它,右边的元素的值大于它。对于产生的分区重复上诉过程。该算法是对冒泡排序的改进。
这里写图片描述

int partion(int a[],int start,int end){
    int i=start,j=end;
    int temp=a[start];
    while(i<j){
        while(i<j && a[j]>=temp)  j--;
        a[i]=a[j];  // i are more 
        while(i<j && a[i]<=temp)  i++;
        a[j]=a[i]; // j are more
    }
    a[i]=temp;   // at end , i=j
    return i;
}
void Qsort(int a[],int start,int end){
    if(start<end){
        int d=partion(a,start,end);
        Qsort(a,start,d);
        Qsort(a,d+1,end);
    }
}

快速排序不是一种稳定的排序算法。平均来说,Qsort的时间复杂度是O(nlogn)

简单选择排序:

思想:第i趟将待排序记录r[i……n]中最小的元素和r[i]交换
这里写图片描述

void SelectSort(int a[],int n){
    for(int i=1;i<n;i++){
       int dex=i;
       for(int j=i+1;j<=n;j++){
           if(a[dex]>a[j]) dex=j;   // use the index to compare and find min one
       }
       if(dex!=i)  {
           a[dex]=a[dex]^a[i];   a[i]=a[dex]^a[i];   a[dex]=a[dex]^a[i];  
       }
    }
}

堆排序:

堆分为大根堆和小根堆。父节点比左右孩子大或者小。
维护堆的性质:
这里写图片描述

堆排序思路:先建堆,自下而上建堆。然后将根节点取出并输出,再把最后的元素放在根节点上,维护堆。重复上面的过程。
这里写图片描述

void Sift(int a[],int s,int n){ 
    int i=s,j=2*s;
    while(j<=n) {
        //if(j<n && a[j]>a[j+1]) j=j+1;  // small heap get big --> small
        //if(a[i]<=a[j]) break;
        if(j<n && a[j]<a[j+1]) j=j+1;  // big heap get small --> big
        if(a[i]>=a[j]) break;
        else {
            swap(a[i],a[j]);
            i=j;  j=2*j;
        }
    }
}
void HeapSort(int a[],int s,int n){
    for(int i=n/2;i>=1;i--)  Sift(a,i,n);  // 建堆自下而上
    show(a,n);
    for(int i=n;i>1;i--){
        swap(a[1],a[i]);
        Sift(a,1,i-1);
    }
}

堆排序的时间复杂度为O(nlogn),是不稳定的排序算法

二路归并排序:

最开始是相邻元素排序,递归进行,比较相邻子集的序列,最后完成进行排序。
这里写图片描述

const int N=1e3;
int b[N];
void merge(int a[],int sdex,int mdex,int edex){
    int i=sdex,j=mdex+1,k=sdex;
    while(i<=mdex&&j<=edex){
        if(a[i]<a[j]) b[k++]=a[i++];
        else b[k++]=a[j++];
    }
    while(i!=mdex+1) b[k++]=a[i++];
    while(j!=edex+1) b[k++]=a[j++];
    for(i=sdex;i<=edex;i++) a[i]=b[i];
}
void MergeSort(int a[],int sdex,int edex){
    int mdex;
    if(sdex<edex){
        mdex=(sdex+edex)/2;
        MergeSort(a,sdex,mdex);
        MergeSort(a,mdex+1,edex);
        merge(a,sdex,mdex,edex);
    }
}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Linux网络基础命令

Linux中网络配置有下面三种方式:ifconfig命令临时配置ip地址、setup工具永久配置ip地址、修改网络配置文件  1,ifconfig命令:查看与配置网络状态 [root@SZB-L0016229 ~]# ifconfig eth0 Link encap:Ethe...
  • zhang19910814
  • zhang19910814
  • 2016-05-11 15:12
  • 592

敢说你java基础很好吗?你能答对几个?(Java基础知识点整理)

1.熟悉IO相关接口和类,知道字符流和字节流的区别。 2.理解Java反射,并熟练使用反射解决问题。 3.理解泛型,并能熟练使用。知道的区别。 4.了解Collection、List、Map、Set之间的关系,以及知道它们绝大部分实现类和子类。Vector、LinkedList、ArrayList的...
  • u014481156
  • u014481156
  • 2015-03-10 21:40
  • 796

如何做到有扎实的 Java 基础

学习java的同学大部分估计都有这样的疑问,到底什么是java基础呢,我们总会去问一些高手,什么是基础,每个人都会有不同的答案告诉你,这时候的你将会接收很多知识,因为这也是基础,那也是基础,整的全都成基础了。这样就是件很让人头疼的事,接下来这篇文章很详细的讲解了java基础有哪些,希望能够帮助大家
  • marvel_java
  • marvel_java
  • 2016-11-21 09:25
  • 2563

Python零基础入门一

上一个寒假学习完了《Android-第一行代码》这本书,这个寒假打算好学习一下python这门语言,一方面是由于对python的爬虫比较感兴趣,另一方面也是算是搜索查找的一种工具。这次学习由于没有找到一本比较合适的零基础入门的书籍,所以直接看的小甲鱼系列的python视频,感觉效果还是不错的。闲话少...
  • BeMoreQuiet
  • BeMoreQuiet
  • 2017-01-09 21:21
  • 889

如何做到有扎实的Java基础

工作这么多年了,主要用的C语言,对Java语言只停留在看一些代码的层面,或者说是知道一些Java的语法。既然下定了决心学习Android App开发,而且也写了一些App代码, 但是发现对Java一些高级的特性还是比较陌生,比如范型编程,反射等,对Java中的类库也不熟悉,更别提对JVM的理解。 于...
  • rex_nie
  • rex_nie
  • 2016-12-29 00:34
  • 1742

JAVA学习需要什么基础

JAVA学习需要什么基础
  • javaniuniu
  • javaniuniu
  • 2017-02-04 13:10
  • 2771

Android 面试题总结之Android 基础(一)

Android 面试题总结之Android 基础(一) 转眼间毕业好久了,写程序也很久了,从高中就一直写到现在好多年了啊,学习了很多东西,把之前整理的资料和知识点慢慢分享出来。这里主要总结Android可能出的面试的题目比较全面\详细,持久更新,也欢迎大家补充,纠正,批评。 Android四大组...
  • vfush
  • vfush
  • 2016-05-23 13:49
  • 13992

JAVA网络基础

1 网络基础简介1.1 两台计算机通信两台计算机需要通过网络进行通信,需要满足三个必备条件:IP地址(所处位置和身份)、协议(共同的语言)和端口号。1.1.1 TCP/IP协议 TCP/IP是目前世界上应用最为广泛的协议 是以TCP/IP为基础的不同层次上多个协议的集合 也称为:TCP/IP协议族...
  • DXZCZH
  • DXZCZH
  • 2016-07-03 10:38
  • 374

计算机网络基础常考面试题总结

1、OSI,TCP/IP,五层协议的体系结构,以及各层协议 答:OSI分层 (7层):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。 TCP/IP分层(4层):网络接口层、 网际层、运输层、 应用层。 五层协议 (5层):物理层、数据链路层、网络层、运输层、 应用...
  • tzs_1041218129
  • tzs_1041218129
  • 2016-08-06 09:13
  • 8716

如何打好编程基础

编程入门学编程怎么打基础程如何打好编程基础C语言编程问题基础C++编程基础
  • qq_34233011
  • qq_34233011
  • 2016-06-01 21:28
  • 2040
    个人资料
    • 访问:331291次
    • 积分:8856
    • 等级:
    • 排名:第2517名
    • 原创:575篇
    • 转载:13篇
    • 译文:0篇
    • 评论:36条
    我的链接
    最新评论