• 编程菜鸟的日记-初学尝试编程-整理内部排序(交换排序(冒泡排序和快速排序)、直接选择排序、直接插入排序,希尔排序)


    //首先是交换排序中的冒泡排序,时间复杂度o(n^2),最好情况下是正序则交换次数为0,时间复杂度为o(n)
    //空间复杂度为o(1)
    //是一个稳定的排序算法
    #include <iostream>
    using namespace std;
    typedef int ElemType;
    void BubbleSort(ElemType R[],int n)
    {
     int i,j,temp;
     for(i=0;i<n-1;i++)//注意i的范围只有0 ~ (n-1),n个数只需要比较n-1次即可
     {
      for(j=n-1;j>i;j--)//将第i+1至n-1个数进行逐个比较,从后往前比较,较小的交换到前面的位置
      {
       if(R[j]<R[j-1])
       {
        temp=R[j];
        R[j]=R[j-1];
        R[j-1]=temp;
       }
      }
     }
    }
    //交换排序中的快速排序,被认为是最高效的排序算法
    //时间复杂度最好的是o(n*log2 n),(此时序列基准刚好是中指)
    //时间复杂度最差的是o(n^2),空间复杂度为o(1),不稳定
    void QuickSort(ElemType R[],int begin,int end)
    {
     int i=begin,j=end;//分别是R的开始位置和结束位置
     if(begin<end)
     {
      ElemType temp=R[begin];//将第一个元素作为基准元素
      while(i!=j)
      {
       while(j>i && R[j]>=temp)
        j--;
       R[i]=R[j];
       while(i<j && R[i]<=temp)
        i++;
       R[j]=R[i];
      }
      R[i]=temp;
      QuickSort(R,begin,i-1);//从第i个位置分成左右两段,对左区域进行排序,
      QuickSort(R,i+1,end);//对右区域进行排序
     }
     
    }
    //选择排序:直接选择排序(简单选择排序),它是一个就地排序。
    //时间复杂度o(n^2),空间复杂度为o(1)
    void SelectSort(ElemType R[],int n)
    {
     ElemType temp;
     for(int i=0;i<n-1;i++)//i为无序区,从0开始一直到数组最后一个
     {
      int k=i;
      for(int j=i+1;j<=n-1;j++)
      {
       if(R[j]<R[k])
        k=j;
       //if(k!=i)
       {
        temp=R[k];
        R[k]=R[i];
        R[i]=temp;
       }
      }
     }
    }
    //堆排序:
    //插入排序:直接插入排序和shell排序
    //将关键字的值直接插入到前面已经排好序的序列中,直到全部待排序的全部插入完成为止
    //直接插入排序,稳定的排序方法
    void InsertSort(ElemType R[],int n)
    {
     ElemType temp;
     for(int i=1;i<=n-1;i++)
     {
      temp=R[i];
      int j=i-1;
      while(j>=0 && temp<R[j])
      {
       R[j+1]=R[j];
       j--;
      }
      R[j+1]=temp;//在j+1处插入R[i]
     }
    }
    //shell排序:分组插入,先取增量为d,进行分组,进行组内插入排序,
    //然后增量d逐渐减小,重复上述过程,直到增量为1,所有记录在同一组中进行直接插入排序为止
    void ShellSort(ElemType R[],int n)
    {
     int i,j,gap;
     ElemType temp;
     gap=n/2;
     while(gap>0)
     {
      for(i=gap;i<n;i++)
      {
       temp=R[i];
       j=i-gap;
       while(j>=0 && temp<R[j])
       {
        R[j+gap]=R[j];
        j=j-gap;
       }
       R[j+gap]=temp;
       j=j-gap;
      }
      gap=gap/2;//减小增量
     }
    }

    void main()

     ElemType R[]={1,4,3,2,0};
     int n=sizeof(R)/sizeof(ElemType);
     //BubbleSort(R,n);
     //QuickSort(R,0,n-1);
     //SelectSort(R,n);
        //InsertSort(R,n);
     ShellSort(R,n);
     for(int i=0;i<=n-1;i++)
     {
      cout<<R[i]<<" ";
     }
     cout<<endl;
     system("pause");
    }

  • 相关阅读:
    红外应用
    电池分类及特点
    温湿度传感器AM2302(DH22)
    lora
    跳频扩频技术学习
    STM32F4/F7运算性能
    物联网相关模块
    DC-DC芯片
    外部引用CSS中 link与@import的区别
    超酷实用的jQuery焦点图赏析及源码
  • 原文地址:https://www.cnblogs.com/lynnycy/p/3411173.html
Copyright © 2020-2023  润新知