码迷,mamicode.com
首页 > 编程语言 > 详细

各种排序算法的实现和总结(部分原创)

时间:2016-04-19 18:58:55      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:

直接上代码:

主程序:

#include <iostream>
using namespace std;

int main()
{
    int a[6];
    cout<<"请输入要排序的六个数字:";    //偷个懒,只输入6个数
    for(int k=0;k<6;k++)
    {
      cin>>a[k];
    }
    cout<<"排序前:";
     for(int m=0;m<6;m++)
        cout<<a[m]<< ;
    cout<<endl;

//此处插入各种排序算法核心代码.......


    cout<<"排序后:";
    for(int m=0;m<6;m++)
    cout<<a[m]<< ;

之后就是各种算法的代码了,在调用相应的算法函数前记得先在main函数中声明哦。

首先冒泡排序,这个比较简单,就像冒泡一样(可以从小到大,也可以从大到小),大的升上去,小的降下来。我这里用的是小的降下来,如下:

void popsort(int a[],int n)
{

    int j=0;
    for(int i=0;i<n-1;i++)
    {
        for(j=n-1;j>i;j--)
    {
        if(a[j]<a[j-1])
        {
        int c=a[j];
        a[j]=a[j-1];
        a[j-1]=c;
        }
    }
    }
}

然后是快速排序法,这个比较重要,采用的递归分治的思想,但是写起来稍微有点麻烦,得经常练练。我这里采用了csdn上的MoreWindows的白话经典上的写法,感觉这个比较清晰,理解起来不难。

void quick_sort(int a[],int l,int r)     
{
    if(l<r){
    int i=l,j=r;
    int x=a[l];           //初始化三个变量,其中l和r对应数组的两个边界(0和n-1),关键值x所在的位置相当于一个坑,需要别人来补,最初的坑的值已经保存到了x中。
    while(i<j)
    {
        while(j>i&&a[j]>x)//从右边开始找小于x的值
            j--;
        if(i<j)
            a[i++]=a[j];   //这里i++主要是因为下一步中a[i]不需要跟x比较,而是从a[i+1]开始比较。
        while(i<j&&a[i]<x)//从左边开始找第一个大于x的值
            i++;
        if(i<j)
            a[j--]=a[i];
    }
    a[i] = x;
    quick_sort(a, l, i - 1); // 对左边递归调用
    quick_sort(a, i + 1, r); //对右边递归调用

    }

我自己的思路不太一样,我是这样想的:在满足if条件时,将二者交换,这样的话我觉得更好理解一些,而且最后不用再给a[i]赋值了。代码稍有不同,如下:

void quick_sort(int a[],int l,int r)
{
    if(l<r){
    int i=l,j=r;
    int x=a[l];          
    while(i<j)
    {
        while(j>i&&a[j]>x)
            j--;
        if(i<j)
            swap(a[i++],a[j]);   //这里采用的swap函数代替的上面的方法1
        while(i<j&&a[i]<x)
            i++;
        if(i<j)
            swap(a[j--],a[i]);
    }
    quick_sort(a, l, i - 1); //此处为跟方法一的另一个不一样的地方,这里不需要另a[i]=x;了,因为之前交换以后a[i]已经是x了
    quick_sort(a, i + 1, r); 

    }
}

之后是来个稍微简单点的插入排序,跟打扑克牌的思路一样:代码如下:

 1 void Insert_sort(int a[],int n)
 2 {
 3     for(int i=1;i<n;i++)
 4     {
 5         for(int j=i;j>0;j--)
 6         {
 7             if(a[j]<a[j-1])
 8             swap(a[j],a[j-1]);
 9 
10         }
11     }
12 
13 }

 

堆排序,希尔排序(建立在插入排序基础上),归并排序以后再说,上面几个感觉比较重要。最后给出各个算法的时间复杂度

平均时间复杂度

插入排序

 O(n2) 

冒泡排序

 O(n2)  

选择排序

 O(n2)  

快速排序

 O(n log n)  

堆排序

 O(n log n)  

归并排序

 O(n log n)  

希尔排序

 O(n1.25)

 

 over~

各种排序算法的实现和总结(部分原创)

标签:

原文地址:http://www.cnblogs.com/jymblog/p/5408752.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!