八种排序算法

最近一段时间自己在研究各种排序算法,于是自己写了一个八种排序算法的集合:

/*************************************************************************
        > Copyright (c)2014  stay hungry,stay foolish !!!
        > File Name: sort.cpp
        > Author: kanty
        > Mail: [email protected]
        > Created Time: 2014年03月23日 星期日 10时14分20秒
        > Question Description:
 ************************************************************************/  

#include<iostream>
using namespace std;  

void bubble_sort(int *a,int m)
{
    int i,j,temp;
    for(i=0;i<m-1;i++)//确定比较趟数
    for(j=0;j<m-1-i;j++)//两两比较
    if(a[j]>a[j+1])//小的上浮,大的下沉
    {
        temp=a[j];
        a[j]=a[j+1];
        a[j+1]=temp;
    }
}
void bubble_sort1(int *a,int m)
{
    int i,j,temp;
     bool flag=true;
     for(i=0;i<m-1&& flag;i++)
     {
      flag=false;
      for(j=0;j<m-1-i;j++)
      if(a[j]>a[j+1])
       {//如果本趟不发生交换,说明该序列已经是有序序列了
        //flag一直为false就不再进行循环了,已经是有序了
         temp=a[j];
          a[j]=a[j+1];
        a[j+1]=temp;
        flag=true;
     }
   }
}
void select_sort(int *a,int m)
{
    int i,j,k,temp;
    for(i=0;i<m-1;i++)//比较趟数
    {
        k=i;//保存下标
        for(j=i+1;j<m;j++)
        if(a[k]>a[j])//将i之后的元素与i对应的元素进行比较,
        //如果后面的元素小于i对应的元素,则交换下标
        k=j;
        if(k!=i)//如果下标不相等就交换对应的元素
        {
            temp=a[k];
            a[k]=a[i];
            a[i]=temp;
        }
    }
}  

int division(int *a,int left,int right)
{
    int base=a[left];//定基准
    while(left<right)
    {
        while(left<right && base<a[right])//将最右边的元素与基准进行比较
        right--;
        a[left]=a[right];
        while(left<right && base>a[left])//将最左边的元素与基准进行比较
        left++;
        a[right]=a[left];
    }
    a[left]=base;
    return left;//返回中间的基准下标
}
void quick_sort(int *a,int left,int right)
{
    if(left<right)
    {
        int mid=division(a,left,right);//先进行分割
        quick_sort(a,left,mid-1);//左递归排序
        quick_sort(a,mid+1,right);//右递归排序
    }
}  

void insert_sort(int *a,int m)
{//此为直接插入排序算法
  int i,j,temp;
    for(i=1;i<m;i++)
    {
        temp=a[i];
        for(j=i-1;j>=0&&temp<a[j];j--)//循环并进行判断,如果后面的元素小于前边的元素,元素依次向右移位
        a[j+1]=a[j];
        a[j+1]=temp;
    }
}  

void shell_sort(int *a,int m)
{
    int i,j,temp,gap;
    for(gap=m/2;gap>0;gap/=2)//进行间隔递增
    {
        for(i=gap;i<m;i++)//从gap开始向后循环
        {
            temp=a[i];
            for(j=i-gap;j>=0&&temp<a[j];j-=gap)//和直接插入排序一样,只是间隔变大而已
            a[j+gap]=a[j];
            a[j+gap]=temp;
        }
    }
}
void b_sort(int *a,int m)
{//此法是折半排序
    int i,j,low,mid,high,temp;
    for(i=1;i<m;i++)
    {
        temp=a[i];
        low=0;
        high=i-1;
        while(low<=high)
        {
            mid=(low+high)/2;//折半
            if(temp<a[mid])//判断要插入的位置范围,并缩小插入的位置
            high=mid-1;
            else
            low=mid+1;
        }
        for(j=i;j>low;j--)//注意最小为low,有低位向高位移动
        a[j]=a[j-1];
        a[low]=temp;
    }
}  

void merge_step(int *a,int *b,int start,int mid,int end)
{
    int i,j,k,temp;
    i=start;
    j=mid+1;//将待排序数组分为前后两部分
    k=0;
    while(i<=mid && j<=end)//判断前后两部分是否到达边界
    {
        if(a[i]<a[j])//比较前后两部分的元素的大小
        b[k++]=a[i++];//将小的赋值给数组b,并依次后移下标
        else
        b[k++]=a[j++];
    }
    while(i<=mid)//对于未到达边界的直接赋值给b数组
    b[k++]=a[i++];
    while(j<=end)
    b[k++]=a[j++];
    for(i=0;i<k;i++)
    a[start+i]=b[i];//将b数组中排好序的元素重新赋值给a,注意加上start,start为起始边界
}
void merge(int *a,int *b,int start,int end)
{
    if(start<end)
    {
        int mid=(start+end)/2;//折半
        merge(a,b,start,mid);//左递归依次分割更小的部分
        merge(a,b,mid+1,end);//右递归依次分割更小的部分
        merge_step(a,b,start,mid,end);//调用排序算法,分别进行排序
    }
}
void merge_sort(int *a,int m)
{
    int *b=new int[m*sizeof(int)];//开辟一个数组空间
    merge(a,b,0,m-1);//排序算法调用
    delete [] b;//释放开辟的空间
    b=0;
}  

void heap_adjust_down(int *a,int start,int end)
{
    int i,temp;
    i=2*start+1;//左孩子节点的下标
    temp=a[start];//保存首元素
    while(i<=end)//判断堆是否到达结尾
    {
        if(i+1<=end && a[i+1]>a[i])//找出左右孩子中最大一个
            i++;
        if(a[i]<=temp)//如果为最大堆顺序就无需调整
            break;
        //最大的子节点上移,替换掉父节点
        a[start]=a[i];
        start=i;
        i=2*start+1;
    }
    a[start]=temp;//将根节点插入到对应的位置
}  

void heap_sort(int *a,int m)
{
    int i,temp;
    for(i=(m-1)/2;i>=0;i--)
    //第一个非叶子节点的下标(m-1)/2
    //首先将数组建成最大二叉堆
        heap_adjust_down(a,i,m-1);//进行堆排序
    for(i=m-1;i>0;i--)
    {//首先将堆顶元素与最后一个元素进行交换
     //可以始终是数组的最后的一个元素保存为最大元素
     //当交换后最后一个元素就保存为最大值
     //对余下的元素重新进行最大堆排序,通过排序将最大值放在数组第一个元素中
        temp=a[i];
        a[i]=a[0];
        a[0]=temp;
        heap_adjust_down(a,0,i-1);
    }
}
void choose_sort(int *array,int n)
{
    cout<<"             please look at the sort algorithm:  "<<endl<<endl;
    cout<<"*************************     sort      ************************"<<endl;
    cout<<"***************   1   冒泡排序 bubble_sort     ****************"<<endl;
    cout<<"***************   2   选择排序 select_sort     ****************"<<endl;
    cout<<"***************   3   快速排序 quick_sort      ****************"<<endl;
    cout<<"***************   4   直接插入排序 insert_sort ****************"<<endl;
    cout<<"***************   5   希尔排序  shell_sort     ****************"<<endl;
    cout<<"***************   6   折半排序  b_sort         ****************"<<endl;
    cout<<"***************   7   归并排序  merge_sort     ****************"<<endl;
    cout<<"***************   8   堆排序    heap_sort      ****************"<<endl;
    cout<<"***************   9   冒泡排序 bubble_sort1     ****************"<<endl;
    cout<<"***************   10 退出选择     ****************"<<endl;
    cout<<"************************************************************"<<endl<<endl;
 int k;
cout<<"please input the number of sort algorithm: ";
cin>>k;
switch(k)
{
case 1 : bubble_sort(array,n);break;
case 2 : select_sort(array,n);break;
case 3 : quick_sort(array,0,n-1);break;
case 4 : insert_sort(array,n);break;
case 5 : shell_sort(array,n);break;
case 6 : b_sort(array,n);break;
case 7 : merge_sort(array,n);break;
case 8 : heap_sort(array,n);break;
case 9 : bubble_sort1(array,n);break;
case 10 : break;
default : break;
}
}
int main()
{
int n;
cout<<"please input a number of n : ";
cin>>n;
int *array=new int[n*sizeof(int)];
cout<<endl<<"please input a array :"<<endl;
for(int i=0;i<n;i++)
 cin>>array[i];
 cout<<endl<<" before sorted "<<endl;
 for(int i=0;i<n;i++)
 cout<<array[i]<<" ";
cout<<endl<<endl;
choose_sort(array,n);//进行排序算法的选择
cout<<endl<<" after sorted "<<endl;
 for(int i=0;i<n;i++)
cout<<array[i]<<" ";
delete [] array;
array=0;
return 0;
} 

 

时间: 2024-10-03 04:57:26

八种排序算法的相关文章

八种排序算法(内部排序)

八种排序算法很长时间没有使用了,今天做一个总结,方便以后自己用的时候参考. 这八种排序算法都是内部算法,这八种排序算法分别是: 1. 插入排序 1)直接插入排序 2)希尔排序 2.选择排序 1)简单选择排序 2)堆排序 3.交换排序 1)冒泡排序 2)快速排序 4.归并排序 5.基数排序 一.直接插入排序 将一个记录插入到已经排好序的有序表中,从而得到一个新的.记录数增1的有序表.在实际操作中,先将序列的第一个记录看成是一个有序的子序列,然后从第二个.第三个.……记录逐个进行插入,直至整个序列有

八种排序算法效率比较

从刚上大一那会儿学的C语言开始,就已经接触到了不少排序算法,但当时都只是为了完成简单的排序任务而已,而且所给的数据也不够多,所以看不出各个排序算法间的执行效率的优劣.最近有个数据结构课程设计的实验,是有关于排序算法之间的效率比较,我就顺便把它放上来了,并对各个算法执行的效率时间做了柱形统计图表.此次实验主要测试了8种排序算法:插入排序.快速排序.冒泡排序.希尔排序.简单选择排序.堆排序.归并排序.折半插入排序. 总共建立了三种情况,分别是平均排序.最好情况排序.最坏情况排序.第一种情况就是使用了

八种排序算法--java实现(转:http://blog.csdn.net/without0815/article/details/7697916)

8种排序之间的关系: 1, 直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排 好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数 也是排好顺序的.如此反复循环,直到全部排好顺序. (2)实例 (3)用java实现 1 package com.njue; 2 3 public class insertSort { 4 public insertSort(){ 5 inta[]={49,38,65,97,76,13,27,49,78,34,12,

java的八种排序算法---冒泡排序

冒泡排序是一种简单的排序算法,它重复的走访要排序的数列,两两比较相邻的元素,如果左边的大于右边就把他们交换过来,以此类推重复的排序,直到没有要排序的数列为止,这个算法的由来是因为越小的数列随着排序会慢慢的浮到数列顶端. /** * 冒泡排序 * 比较相邻的元素.如果第一个比第二个大,就交换他们两个. * 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. * 针对所有的元素重复以上的步骤,除了最后一个. * 持续每次对越来越少的元素重复上面的步骤,

java八种排序算法---快速排序

快速排序基本思想:挖坑填数+递归分治 快速排序使用分治法的策略,把一个串行分成2个子串行,快速排序又是一种分而治之的思想在排序算法是上的典型应用,本质上看,快速排序应该算冒泡排序基础上的递归分治法,快速排序名字简单粗暴,顾名思义就是快而且效率高,它是处理大数据最快的算法之一了. 算法描述:1.从数列中任意挑出一个数作为基准(pivot) 2.重新排序,所有比基准大的数放在基准左边,所有比基准大的数放在基准右边,这样排序一遍后该基准就位于数列的中间,这个就被称为分区操作(partition) 3.

一遍记住Java常用的八种排序算法与代码实现

1.直接插入排序 经常碰到这样一类排序问题:把新的数据插入到已经排好的数据列中. 将第一个数和第二个数排序,然后构成一个有序序列 将第三个数插入进去,构成一个新的有序序列. 对第四个数.第五个数--直到最后一个数,重复第二步. 如何写写成代码: 首先设定插入次数,即循环次数,for(int i=1;i<length;i++),1个数的那次不用插入. 设定插入数和得到已经排好序列的最后一个数的位数.insertNum和j=i-1. 从最后一个数开始向前循环,如果插入数小于当前数,就将当前数向后移动

Java常用的八种排序算法与代码实现

1.直接插入排序 2.希尔排序 3.简单选择排序 4.堆排序 5.冒泡排序 6.快速排序 7.归并排序 8.基数排序 1.直接插入排序 经常碰到这样一类排序问题:把新的数据插入到已经排好的数据列中. 将第一个数和第二个数排序,然后构成一个有序序列 将第三个数插入进去,构成一个新的有序序列. 对第四个数.第五个数--直到最后一个数,重复第二步. 如何写成代码: 首先设定插入次数,即循环次数,for(int i=1;i<length;i++),1个数的那次不用插入. 设定插入数和得到已经排好序列的最

总结N种排序算法及实现

排序算法是一个简单的问题,但在此问题上却有大量的研究!当前的排序算法通常按照如下四个方面进行分类(或是评价): 1.时间复杂度:一个排序算法的理想性能是O(n).一般而言,好的性能O(nlogn),坏的性能O(n2). 2.空间复杂度(内存使用量) 3.稳定性:稳定的排序算法会让原本有相等键值的记录维持原本的相对次序. 4.排序方式:插入.交换.选择.合并等 一.冒泡排序:这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端. 步骤:1.比较相邻的两个元素,如果第一个比第二个大,就

12种排序算法:原理、图解、动画视频演示、代码以及笔试面试题目中的应用

出处:http://blog.csdn.net/han_xiaoyang/article/details/12163251. 声明:版权所有,转载请注明出处,谢谢. 0.前言 从这一部分开始直接切入我们计算机互联网笔试面试中的重头戏算法了,初始的想法是找一条主线,比如数据结构或者解题思路方法,将博主见过做过整理过的算法题逐个分析一遍(博主当年自己学算法就是用这种比较笨的刷题学的,囧),不过又想了想,算法这东西,博主自己学的过程中一直深感,基础还是非常重要的,很多难题是基础类数据结构和题目的思想综