java:排序算法

selection排序

import java.util.*;
import java.util.Comparator;

public class Solution {
    private Solution(){} //初始化函数

    public static void sort(Comparable[] a){
        //a是升序排列
         int N=a.length;
         for(int i=0;i<N;i++){
             int min=i; //最小元素的索引
             for(int j=i+1;j<N;j++)
                 if(less(a[j],a[min])<0)
                     min=j;
             exch(a,i,min);
         }
    }

    private static int less(Comparable v,Comparable w){
        return v.compareTo(w);
    }

    private static void exch(Comparable[] a, int i, int j){
        Comparable t=a[i];a[i]=a[j];a[j]=t;
    }
    private static void show(Comparable[] a){
        for(int i=0;i<a.length;i++)
            System.out.println(a[i]+" ");
        System.out.println(" ");
    }
    public static boolean isSorted(Comparable[] a){
        //  测试元素是否有序
        for(int i=1;i<a.length;i++)
            if(less (a[i],a[i-1]))
                return false;
        return true;
    }
    public static void main(String[] args)
    {

        Scanner cin=new Scanner(System.in);
        int n=cin.nextInt();
        Integer[] temp= new Integer[n];
        for(int i=0;i<n;i++)
            temp[i]=new Integer(cin.nextInt());
        Comparable[] a=new Comparable[n];

        for(int i=0;i<n;i++)
        {

            a[i]=temp[i];
        }
        sort(a);
        assert isSorted(a);
        show(a);

    }

}

  • 插入排序(O(n) ~O(n*n))

    左边有序,右边位置后移

public static void sort(Comparable[] a){
        //a是升序排列
        int N=a.length;
        for(int i=1;i<N;i++)
            // 将a[i]插入a[i-1],a[i-2],.... 之中
        {
            for(int j=i;j>0 && less(a[j],a[j-1]);j--)
                exch(a,j,j-1);
        }
    }

希尔排序

任意间隔h的元素都是有序

public static void sort(Comparable[] a){
        //a[]升序
        int N=a.length;
         int h=1;
         while(h<N/3) h=3*h+1; //1,4,13,40...
         while(h>=1){
             // 将数组变成h有序
              for(int i=h;i<N;i++){
                  //a[i]插入到a[i-h],a[i-2*h],a[i-3*h],....
                  for(int j=i; j>=h && less(a[j],a[j-h]);j-=h){
                      exch(a,j,j-h);
                  }
                  h=h/3;

              }

         }
    }

归并排序

时间:NlgN

空间:N

import java.util.*;
import java.util.Comparator;

public class Solution {
    private Solution(){} //初始化函数

    private static Comparable[] aux; // 辅助数组
    public static void merge(Comparable[] a,int lo,int mid,int hi){
        //将a[lo..mid]和a[mid+1,..,hi]

        int i=lo,j=mid+1;

        for(int k=lo;k<=hi;k++) //将a[lo..hi]复制到aux[lo..hi]
            aux[k]=a[k];

        for(int k=lo;k<=hi;k++){
            if(j>mid) a[k]=aux[j++];  //[j++]=[j],然后j++
            else if (j>hi) a[k]=a[i++];
            else if (less(aux[j],aux[i])) a[k]=aux[j++];
            else a[k]=aux[i++];
        }
    }

    //自顶向下递归

    public static void sort(Comparable[] a) //归并所需要排序的数组
    {
        aux=new Comparable[a.length]; //一次性分配空间
        sort(a,0,a.length-1);
    }

    private static void sort(Comparable[] a,int lo,int hi){
        //将数组a[lo...hi] 排序
        if(hi<=lo) return;
        int mid=lo+(hi-lo)/2;
        sort(a,lo,mid); // 左边排序
        sort(a,mid+1,hi); //右边排序
        merge(a,lo,mid,hi);  // 归并结果
    }

    private static boolean less(Comparable v,Comparable w){
        if(v.compareTo(w)<=0)
            return true;
        else
            return false;
    }

    private static void exch(Comparable[] a, int i, int j){
        Comparable t=a[i];a[i]=a[j];a[j]=t;
    }
    private static void show(Comparable[] a){
        for(int i=0;i<a.length;i++)
            System.out.println(a[i]+" ");
        System.out.println(" ");
    }
    public static boolean isSorted(Comparable[] a){
        //  测试元素是否有序
        for(int i=1;i<a.length;i++)
            if(less (a[i],a[i-1]))
                return false;
        return true;
    }
    public static void main(String[] args)
    {

        Scanner cin=new Scanner(System.in);
        int n=cin.nextInt();
        Integer[] temp= new Integer[n];
        for(int i=0;i<n;i++)
            temp[i]=new Integer(cin.nextInt());
        Comparable[] a=new Comparable[n];

        for(int i=0;i<n;i++)
        {

            a[i]=temp[i];
        }
        sort(a);
        assert isSorted(a);
        show(a);

    }

}
  • 非递归代码

自底向上的归并

    public static void sort(Comparable[] a) //归并所需要排序的数组
    {
        //进行lgn次两两归并
        int N=a.length;
        aux=new Comparable[N];
        for(int sz=1;sz<N;sz=sz+sz) // sz子数组的大小
            for(int lo=0;lo<N-sz;lo+=sz+sz){
                merge(a,lo,lo+sz-1,Math.min(lo+sz+sz-1,N-1));
            }

    }

快速排序

时间复杂度:NlgN

空间复杂度:lgN

  • 基本快速
import java.util.*;
import java.util.Comparator;

public class Solution {
    private Solution(){} //初始化函数

    public static void sort(Comparable[] a){
        // StdRandom.shuffle(a);//打乱数组  // 保持随机性,或者随机选择数组
        sort(a,0,a.length-1);

    }

    private static void sort(Comparable[] a,int lo,int hi){
        if(lo<hi) return;
        int j=partition(a,lo,hi); //切分函数
        sort(a,lo,hi);//  将左半部分排序 a[low,j-1]
        sort(a,j+1,hi); //将右半部分排序 a[j+1,hi]
    }

    //  切分函数,选择a[lo] 为切分值
    private static int partition(Comparable[] a,int lo,int hi){
        int i=lo,j=hi+1; //左右扫描指针
        Comparable v=a[lo]; //切分元素
        while(true){
            //左右扫描,检查扫描是否结束,交换元素
            while(less(a[++i],v)) if(i==hi) break;
            while(less(v,a[--j])) if(j=lo) break;
            if(i>=j) break;
            exch(a,lo,j);
        }
        exch(a,lo,j); //将v=[j] 放入正确位置
        return j;
    }

    private static boolean less(Comparable v,Comparable w){
        if(v.compareTo(w)<=0)
            return true;
        else
            return false;
    }

    private static void exch(Comparable[] a, int i, int j){
        Comparable t=a[i];a[i]=a[j];a[j]=t;
    }
    private static void show(Comparable[] a){
        for(int i=0;i<a.length;i++)
            System.out.println(a[i]+" ");
        System.out.println(" ");
    }
    public static boolean isSorted(Comparable[] a){
        //  测试元素是否有序
        for(int i=1;i<a.length;i++)
            if(less (a[i],a[i-1]))
                return false;
        return true;
    }
    public static void main(String[] args)
    {

        Scanner cin=new Scanner(System.in);
        int n=cin.nextInt();
        Integer[] temp= new Integer[n];
        for(int i=0;i<n;i++)
            temp[i]=new Integer(cin.nextInt());
        Comparable[] a=new Comparable[n];

        for(int i=0;i<n;i++)
        {

            a[i]=temp[i];
        }
        sort(a);
        assert isSorted(a);
        show(a);

    }

}
  • 改进的快速排序

堆排序

  • 建堆时间:o(n)
  • 调整堆:O(lgn)
  • 复杂度:O(nlgn)
import java.util.*;
import java.util.Comparator;

public class Solution {
    private Solution(){} //初始化函数

    public static void sort(Comparable[] a)
    {
        int N=a.length;
        for(int k=N/2;k>=1;k--)
            sink(a,k,N);// 下沉(由上而下的堆得有序化)// 构建了堆
        while(N>1){
            exch(a,1,N--);
            sink(a,1,N);
        }
    }

    private static void sink(Comparable[] a,int k, int N)
    {
        while(2*k<=N){
            int j=2*k;
            if(j<N && less(a,j,j+1))
                j++;
            if(!less(a,k,j))  break;
            exch(a,k,j);
            k=j;
        }
    }

    private static boolean less(Comparable[] a,int i,int j){
        return a[i-1].compareTo(a[j-1])<0;
    }

    private static boolean less(Comparable v,Comparable w){
        if(v.compareTo(w)<=0)
            return true;
        else
            return false;
    }

    private static void exch(Comparable[] a, int i, int j){
        Comparable t=a[i];a[i]=a[j];a[j]=t;
    }
    private static void show(Comparable[] a){
        for(int i=0;i<a.length;i++)
            System.out.println(a[i]+" ");
        System.out.println(" ");
    }
    public static boolean isSorted(Comparable[] a){
        //  测试元素是否有序
        for(int i=1;i<a.length;i++)
            if(less (a[i],a[i-1]))
                return false;
        return true;
    }
    public static void main(String[] args)
    {

        Scanner cin=new Scanner(System.in);
        int n=cin.nextInt();
        Integer[] temp= new Integer[n];
        for(int i=0;i<n;i++)
            temp[i]=new Integer(cin.nextInt());
        Comparable[] a=new Comparable[n];

        for(int i=0;i<n;i++)
        {

            a[i]=temp[i];
        }
        sort(a);
        assert isSorted(a);
        show(a);

    }

}
时间: 2024-10-01 02:56:12

java:排序算法的相关文章

Java排序算法(一)

Java排序算法(一) 一.排序的基本概念和分类 1.1排序的定义 在<大话数据结构>中,排序定义为,假设含有n个记录的序列为{r1,r2,...,rn},其相应的关键字{k1,k2,...,kn},需确定1,2...n的一种排列p1,p2...pn,是其相应的关键字满足Kp1<=Kp2<=...<=Kpn(非递减或非递增)关键,即使得序列称为一个按关键字有序的序列{rp1,rp2...rp3},这样的操作称为排序. 1.2排序的稳定性 假设ki=kj(1<=i<

java排序算法(六):直接插入排序

java排序算法(六):直接插入排序 直接插入排序的基本操作就是将待的数据元素按其关键字的大小插入到前面的有序序列中 直接插入排序时间效率并不高,如果在最坏的情况下,所有元素的比较次数的总和为(0+1..n-1)= o(n^2).其他情况下也要考虑移动元素的次数.故时间复杂度是o(n^2) 直接插入空间效率很好,只需要一个缓存数据单元,也就是说空间复杂度是o(1) 直接插入排序是稳定的 直接插入排序在数据以有一定顺序的情况下,效率较好.但如果数据无规则,则需要移动大量的数据.其效率就和冒泡排序和

Java排序算法-Java入门|Java基础课程

Java 排序算法 1. 课程目标 排序是任何语言都会使用到的功能之一,然成果排序的算法有很多,对空间的要求及其时间效率也不尽相同. 本文章以Java语言示例,通过对空间要求.时间效率要求,来对比各种排序算法的使用场景 2.适用对象 Java语言初学者 Java算法爱好者 3.相关概念 3.1 排序概念 排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作. 3.2 排序算法 排序算法,就是如何使得记录按照要求排列的方法. 排序算法在很多领域得到相当地重视,尤其是在

Java排序算法 - 堆排序的代码

把内容过程中比较重要的一些内容片段做个备份,如下的资料是关于Java排序算法 - 堆排序的内容. import java.util.Arrays; public class HeapSort { int a[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51}; public HeapSort(){ heapSort(a); } public void heapSort(int[

Java排序算法(四):希尔排序

[基本思想] 将原本有大量记录数的记录进行分组,分割成若干个子序列,此时每个子序列待排序的记录个数就比较少了,然后在这些子序列内分别进行直接插入排序,当整个序列都基本有序时,再对全体记录进行一次直接插入排序. 所谓的基本有序,就是小的关键字基本在前面,大的基本在后面,不大不小的基本在中间,像{2, 1, 3, 6, 4, 7, 5, 8, 9}这样可以称为基本有序了. [java实现] public class ShellSort { public static void main(String

java排序算法

1.插入排序 插入排序是最简单的排序算法之一,由N-1趟排序组成,必须得保证位置0到p处的元素都是已排序状态. 具体实现的代码如下: package k; import java.util.Scanner; public class test2 { public static void main(String[] args) { Scanner in=new Scanner(System.in); //获取输入的字符串,并且把中间的空格全部去掉 String [] str = in.nextLi

java排序算法之希尔排序

希尔排序是冲破二次时间屏障的第一批算法之一. 它是通过比较相距一定间隔的元素来工作,各趟比较所用的距离随着算法的进行而减小,直到最后一趟(比较相邻元素)为止.因此希尔排序也叫缩减增量排序. 希尔排序使用一个序列h1,h2,h3...hk来排序. 具体的意思是 第一趟排序比较的是相隔为hk的元素,也就是比较a[i]与a[i+hk],保证a[i]<=a[i+hk]. 第二次比较的是相隔为hk-1的元素,也就是比较a[i]与a[i+hk-1],保证a[i]<=a[i+hk-1]. 直到最后比较的是相

(转)java 排序算法

排序算法汇总(java实现,附源代码) 整理系统的时候发现了原来写的各种算法的总结,看了一下,大吃一惊,那时候的我还如此用心,具体的算法,有的已经模糊甚至忘记了,看的时候就把内容整理出来,顺便在熟悉一下,以后需要的时候就可以直接过来摘抄了.下面是总结的几个常用的排序算法: 插入排序 快速排序 冒泡排序 堆排序 计数排序 桶排序 可能大家对插入排序,快速排序,冒泡排序比较常用,在满足需求的时候也简单一些,下面逐一说一下每个算法的实现方式,不保证是写的最有效率的,但是能保证的是,各种算法的中心思想是

Java排序算法总结

稳定排序:* 泡沫排序(bubble sort) — O(n²)* 插入排序 (insertion sort)— O(n²)* 桶排序 (bucket sort)— O(n); 需要 O(k) 额外空间* 计数排序 (counting sort) — O(n+k); 需要 O(n+k) 额外空间* 合并排序 (merge sort)— O(n log n); 需要 O(n) 额外空间* 二叉排序树排序 (Binary tree sort) — O(n log n)期望时间; O(n²)最坏时间;

Java排序算法(四):Shell排序

[基本的想法] 将原本有大量记录数的记录进行分组.切割成若干个子序列,此时每一个子序列待排序的记录个数就比較少了,然后在这些子序列内分别进行直接插入排序,当整个序列都基本有序时.再对全体记录进行一次直接插入排序. 所谓的基本有序,就是小的keyword基本在前面,大的基本在后面,不大不小的基本在中间.像{2, 1, 3, 6, 4, 7, 5, 8, 9}这样能够称为基本有序了. [java实现] public class ShellSort { public static void main(