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

排序总结一(常见的八种排序)

时间:2015-10-18 20:00:49      阅读:251      评论:0      收藏:0      [点我收藏+]

标签:

1冒泡排序:

技术分享

void Bubble(int *A,int n)//冒泡算法的简单实现
{
    for(int i=0;i<n-1;i++)
    {
        for(int j=0;j<n-i-1;j++)
        {
            if(A[j]>A[j+1])
            {
                int temp=A[j];
                A[j]=A[j+1];
                A[j+1]=temp;
            }
        }
    }
}

改进后的冒泡排序1,增加标示位

void Bubble_1(int *A,int n)//改进后的冒泡算法,增加标示位
{
    bool pos=false;
    for(int i=0;i<n-1;i++)
    {
        pos=true;
        for(int j=0;j<n-i-1;j++)
        {
            if(A[j]>A[j+1])
            {
                int temp=A[j];
                A[j]=A[j+1];
                A[j+1]=temp;
                pos=false;
            }
        }
        if(pos) return;
    }
}

 

2选择排序:

技术分享

void Select(int *A,int n)//简单选择排序
{
    int min;
    for(int j=0;j<n-1;j++)
    {    
        min=j;
        for(int i=j+1;i<n;i++)
        {
        if(A[min]>A[i])
            min=i;
        }
        int temp=A[min];
        A[min]=A[j];
        A[j]=temp;
    }
}

改进的双向选择排序

void Select_1(int *A,int n)//双向选择排序
{
    int min,max;
    for(int j=0;j<(n-1)/2;j++)
    {
        min=j;
        max=n-j-1;
        for(int i=j+1;i<n-j;i++)
        {
            if(A[min]>A[i])
                min=i;
            if(A[max]<A[i])
                max=i;
        }
        int temp=A[min];
        A[min]=A[j];
        A[j]=temp;
        temp=A[max];
        A[max]=A[n-j-1];
        A[n-j-1]=temp;
    }
}

3插入排序

技术分享

void Insert(int *A,int n)//直接插入算法
{
    int temp,count;
    if(n<2)return;
    for(int i=1;i<n;i++)
    {
        temp=A[i];
        count=i-1;
        while(count>=0&&A[count]>temp)
        {
            A[count+1]=A[count];
            count--;
        }
        A[count+1]=temp;        
    }
}

4希尔排序(改进的插入排序):

技术分享

void ShellSort(int *A,int n)//带有步长选择的插入排序
{
    for(int div=n/2;div>=1;div/=2)
    {
        for(int i=div;i<n;i++)
        {
            for(int j=i;j-div>=0&&A[j]<A[j-div]&&j>=0;j-=div)
/*主要看这里,与其说是插入排序,不如说是有步长选择的冒泡排序,
并不是说它不对,只是不好直观理解。*/
            {
                int temp=A[j];
                A[j]=A[j-div];
                A[j-div]=temp;
            }
        }        
    }
}
void ShellSort_1(int *A,int n)//利用插入排序的模型,直观的写法。
{
    for(int div=n/2;div>=1;div/=2)
    {
        for(int i=div;i<n;i++)
        {
            int temp,count;
            temp=A[i];
            count=i-div;
            while(count>=0&&A[count]>temp)
            {
                A[count+div]=A[count];
                count-=div;
            }
            A[count+div]=temp;
        }
    }
}

可以将可变步长单独写成一个函数

void ShellInsert(int *A,int n,int div)
{
        for(int i=div;i<n;i++)
        {
            int temp,count;
            temp=A[i];
            count=i-div;
            while(count>=0&&A[count]>temp)
            {
                A[count+div]=A[count];
                count-=div;
            }
            A[count+div]=temp;
        }
}

 5归并排序:

技术分享

归并排序在《算法导论》里是最先接触的,也是最为基础的用来理解递归的一种算法,具有O(nlogn)的时间复杂度和O(n)的空间复杂度。

 

http://blog.csdn.net/hguisu/article/details/7776068

 

排序总结一(常见的八种排序)

标签:

原文地址:http://www.cnblogs.com/fastcam/p/4883545.html

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