您的位置:首页 > 编程语言 > Java开发

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

2017-12-13 13:27 561 查看
本文需要5分钟左右阅读完成,建议收藏以后阅读,里面都是干货,可以亲自试验一下,如果觉得好用可以帮忙点赞转发一下,谢谢!交流学习java大数据可以加群460570824。

1.直接插入排序

经常碰到这样一类排序问题:把新的数据插入到已经排好的数据列中。

将第一个数和第二个数排序,然后构成一个有序序列

将第三个数插入进去,构成一个新的有序序列。

对第四个数、第五个数……直到最后一个数,重复第二步。

如何写写成代码:

首先设定插入次数,即循环次数,for(inti=1;i<length;i++),1个数的那次不用插入。

设定插入数和得到已经排好序列的最后一个数的位数。insertNum和j=i-1。

从最后一个数开始向前循环,如果插入数小于当前数,就将当前数向后移动一位。

将当前数放置到空着的位置,即j+1。

代码实现如下:

 

public void insertSort(int[] a){

       int length=a.length;//数组长度,将这个提取出来是为了提高速度。

       int insertNum;//要插入的数

       for(int i=1;i<length;i++){//插入的次数

           insertNum=a[i];//要插入的数

           int j=i-1;//已经排序好的序列元素个数

           while(j>=0&&a[j]>insertNum){//序列从后到前循环,将大于insertNum的数向后移动一格

                a[j+1]=a[j];//元素移动一格

                j--;

           }

           a[j+1]=insertNum;//将需要插入的数放在要插入的位置。

       }

    }

2.希尔排序

对于直接插入排序问题,数据量巨大时。

将数的个数设为n,取奇数k=n/2,将下标差值为k的书分为一组,构成有序序列。

再取k=k/2 ,将下标差值为k的书分为一组,构成有序序列。

重复第二步,直到k=1执行简单插入排序。

如何写成代码:

首先确定分的组数。

然后对组中元素进行插入排序。

然后将length/2,重复1,2步,直到length=0为止。

代码实现如下:public  void sheelSort(int[] a){

       int d  = a.length;

       while (d!=0) {

           d=d/2;

           for (int x = 0; x < d; x++) {//分的组数

                for (int i = x + d; i <a.length; i += d) {//组中的元素,从第二个数开始

                    int j = i - d;//j为有序序列最后一位的位数

                    int temp = a[i];//要插入的元素

                    for (; j >= 0 &&temp < a[j]; j -= d) {//从后往前遍历。

                        a[j + d] = a[j];//向后移动d位

                    }

                    a[j + d] = temp;

                }

           }

       }

    }

3.简单选择排序

常用于取序列中最大最小的几个数时。

(如果每次比较都交换,那么就是交换排序;如果每次比较完一个循环再交换,就是简单选择排序。)

遍历整个序列,将最小的数放在最前面。

遍历剩下的序列,将最小的数放在最前面。

重复第二步,直到只剩下一个数。

如何写成代码:

 

首先确定循环次数,并且记住当前数字和当前位置。

将当前位置后面所有的数与当前数字进行对比,小数赋值给key,并记住小数的位置。

比对完成后,将最小的值与第一个数的值交换。

重复2、3步。

代码实现如下:public voidselectSort(int[] a) {

       int length = a.length;

       for (int i = 0; i < length; i++) {//循环次数

           int key = a[i];

           int position=i;

           for (int j = i + 1; j < length; j++) {//选出最小的值和位置

                if (a[j] < key) {

                    key = a[j];

           
a3d6
         position = j;

                }

           }

           a[position]=a[i];//交换位置

           a[i]=key;

       }

    }

4.堆排序

对简单选择排序的优化。

将序列构建成大顶堆。

将根节点与最后一个节点交换,然后断开最后一个节点。

重复第一、二步,直到所有节点断开。

代码实现如下:

 

public void heapSort(int[] a){

       System.out.println("开始排序");

       int arrayLength=a.length;

       //循环建堆 

       for(int i=0;i<arrayLength-1;i++){

           //建堆 

 

           buildMaxHeap(a,arrayLength-1-i);

           //交换堆顶和最后一个元素 

           swap(a,0,arrayLength-1-i);

           System.out.println(Arrays.toString(a));

       }

    }

   private  void swap(int[] data, inti, int j) {

        // TODO Auto-generated method stub 

       int tmp=data[i];

       data[i]=data[j];

       data[j]=tmp;

    }

   //对data数组从0到lastIndex建大顶堆 

   private void buildMaxHeap(int[] data, int lastIndex) {

       // TODO Auto-generated method stub 

        //从lastIndex处节点(最后一个节点)的父节点开始 

       for(int i=(lastIndex-1)/2;i>=0;i--){

           //k保存正在判断的节点 

           int k=i;

           //如果当前k节点的子节点存在 

           while(k*2+1<=lastIndex){

                //k节点的左子节点的索引 

                int biggerIndex=2*k+1;

                //如果biggerIndex小于lastIndex,即biggerIndex+1代表的k节点的右子节点存在 

                if(biggerIndex<lastIndex){

                    //若果右子节点的值较大 

                   if(data[biggerIndex]<data[biggerIndex+1]){

                        //biggerIndex总是记录较大子节点的索引 

                        biggerIndex++;

                    }

                }

                //如果k节点的值小于其较大的子节点的值 

               if(data[k]<data[biggerIndex]){

                    //交换他们 

                   swap(data,k,biggerIndex);

                    //将biggerIndex赋予k,开始while循环的下一次循环,重新保证k节点的值大于其左右子节点的值 

                    k=biggerIndex;

                }else{

                    break;

                }

           }

       }

    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: