java快速排序和选择排序实现实例解析

 更新时间:2023年11月16日 10:44:16   作者:胡子拉碴的沙滩裤  
这篇文章主要为大家介绍了java快速排序和选择排序实现实例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

一、快速排序(Quick Sort)

快速排序采用分治法。首先从数列中挑出一个元素作为中间值。依次遍历数据,所有比中间值小的元素放在左边,所有比中间值大的元素放在右边。然后按此方法对左右两个子序列分别进行递归操作,直到所有数据有序。最理想的情况是,每次划分所选择的中间数恰好将当前序列几乎等分(均匀排布),整个算法的时间复杂度为O(n logn)

最坏的情况是,每次所选的中间数是当前序列中的最大或最小元素(正序和逆序都是最坏),整个排序算法的时间复杂度为O(n²)。

平均时间复杂度为O(n logn),空间复杂度为O(logn),是一种不稳定的排序算法。

附算法实现源码:

//快速排序
template <class T>
int Partition(T data[],int left,int right)
{
    T pivot=data[left];
    while(left<right)
    {
        while(left<right&&data[right]>pivot)
            right--;
        data[left]=data[right];
        while(left<right&&data[left]<=pivot)
            left++;
        data[right]=data[left];
    }
    data[left]=pivot;
    return left;
}
template <class T>
void QuickSort(T data[],int left,int right)
{
if(left<right)
{
    int p=Partition(data,left,right);
    QuickSort(data,left,p-1);
    QuickSort(data,p+1,right);
}
}

二、、选择排序(Selection Sort)

遍历所有数据,先在数据中找出最大或最小的元素,放到序列的起始;然后再从余下的数据中继续寻找最大或最小的元素,依次放到序列中直到所有数据有序。原始数据的排列顺序不会影响程序耗费时间O(n²),相对费时,不适合大量数据排序。

平均时间复杂度为O(n²),空间复杂度为O(1),是一种不稳定的排序算法。

附算法实现源码:

//选择排序
template <class T>
void SelectionSort(T data[],int n)
{
    for(int i=1;i<n;i++)
    {
        int k=i-1;
        for(int j=i;j<n;j++)
        {
            if(data[j]<data[k])
            {
                k=j;
            }
        }
        if(k!=i-1)
        {
            T t=data[k];
            data[k]=data[i-1];
            data[i-1]=t;
        }
    }
}

三、插入排序(Insertion Sort)

将前i个(初始为1)数据假定为有序序列,依次遍历数据,将当前数据插入到前述有序序列的适当位置,形成前i+1个有序序列,依次遍历完所有数据,直至序列中所有数据有序。数据是反序时,耗费时间最长O(n²);数据是正序时,耗费时间最短O(n)。适用于部分数据已经排好的少量数据排序。

平均时间复杂度为O(n²),空间复杂度为O(1),是一种稳定的排序算法。

附算法实现源码(直接插入+折半插入):

//直接插入排序
template <class T>
void InsertionSort(T Data[],int n)
{
    int p,i;
    for(p=1;p<n;p++)
    {
        T temp=Data[p];
        i=p-1;
        while(i>=0&&Data[i]>temp)
        {
            Data[i+1]=Data[i];
            i--;
        }
        Data[i+1]=temp;
    }
}
//折半插入排序
template <class T>
void BinaryInsertionSort(T Data[],int n)
{
    int left,mid,right,p;
    for(p=1;p<n;p++)
    {
        T temp=Data[p];
        left =0;
        right=n-1;
        while(left<=right)
        {
            mid=(left+right)/2;
            if(Data[mid]>temp)
                right=mid-1;
            else
                left=mid+1;
        }
        for(int i=p-1;i>=left;i--)
            Data[i+1]=Data[i];
        Data[left]=temp;
    }
}

四、希尔排序(Shell Sort)

希尔排序也称递减增量排序,是对插入排序的改进,以牺牲稳定性的方法提高效率。基本思路是先将整个数据序列分割成若干子序列分别进行直接插入排序,待整个序列中的记录基本有序时,再对全部数据进行依次直接插入排序,直至所有数据有序。希尔排序算法的性能与所选取的分组长度序列有很大关系,复杂度下界为O(n log²n),在中等规模的数据中表现良好。

平均时间复杂度为O(n^3/2),空间复杂度为O(1),是一种不稳定的排序算法。

附算法实现源码:

//希尔排序
template <class T>
void ShellSort(T Data[],int n)
{
    int d=n/2;
    while(d>=1)
    {
        for(int k=0;k<d;k++)
        {
            for(int i=k+d;i<n;i+=d)
            {
                T temp=Data[i];
                int j=i-d;
                while(j>=k&&Data[j]>temp)
                {
                    Data[j+d]=Data[j];
                    j-=d;
                }
                Data[j+d]=temp;
            }
        }
        d=d/2;
    }
}

以上就是java快速排序和选择排序实现实例解析的详细内容,更多关于java快速排序选择排序的资料请关注脚本之家其它相关文章!

相关文章

  • java反编译工具jd-gui使用详解

    java反编译工具jd-gui使用详解

    JD-GUI是一个独立的图形实用程序,显示“.class”文件的Java源代码,本文主要介绍了java反编译工具jd-gui使用详解,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • java ssm框架的controller实现向页面传递参数

    java ssm框架的controller实现向页面传递参数

    这篇文章主要介绍了java ssm框架的controller实现向页面传递参数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • springboot的http.server.requests服务请求流程源码

    springboot的http.server.requests服务请求流程源码

    这篇文章主要为大家介绍了springboot的http.server.requests服务请求流程源码,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Java 初识CRM之项目思路解析

    Java 初识CRM之项目思路解析

    本篇文章意在帮助大家了解CRM的一些基本概念,介绍相关业务,后文也将会将基于笔者所在公司的业务详细阐述CRM各模块,感兴趣的朋友快来看看吧
    2021-11-11
  • Windows10系统下修改jar中的文件并重新打包成jar文件然后运行的操作步骤

    Windows10系统下修改jar中的文件并重新打包成jar文件然后运行的操作步骤

    这篇文章主要介绍了Windows10系统下修改jar中的文件并重新打包成jar文件然后运行的操作步骤,文中通过图文结合的形式给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-08-08
  • Spring使用aop切面编程时要给那些类加注解的实例

    Spring使用aop切面编程时要给那些类加注解的实例

    在使用切面编程时,通常需要为以下类或组件添加注解来标识它们,以便 Spring 或其他切面框架能够正确识别和处理它们,这篇文章主要介绍了Spring使用aop切面编程时要给那些类加注解,需要的朋友可以参考下
    2023-11-11
  • java多态的向上转型的概念及实例分析

    java多态的向上转型的概念及实例分析

    在本篇内容里小编给大家整理的是一篇关于java多态的向上转型的概念及实例分析,对此有兴趣的朋友们可以跟着学习下。
    2021-05-05
  • xml与Java对象的转换详解

    xml与Java对象的转换详解

    这篇文章主要介绍了xml与Java对象的转换详解的相关资料,需要的朋友可以参考下
    2017-04-04
  • SpringBoot整合Redisson的步骤(单机版)

    SpringBoot整合Redisson的步骤(单机版)

    Redisson非常适用于分布式锁,而我们的一项业务需要考虑分布式锁这个应用场景,于是我整合它做一个初步简单的例子(和整合redis一样)。
    2021-05-05
  • springboot获取profile的操作

    springboot获取profile的操作

    这篇文章主要介绍了springboot获取profile的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09

最新评论