七大经典排序(Java版)

摘要:
//希尔排序公共静态空壳排序{for{int temp=a[i];int j=i-r;而{a[j+r]=a[j];j-=r;}a[j+r]=temp;}}}快速排序算法1、将任何要排序的元素作为基准,称为基准元素;2.划分要排序的元素,并将大于基准元素的元素放置在其右侧,将小于基准元素的元件放置在其左侧;3.对左侧和右侧分区重复上述步骤,直到所有元素都按顺序排列。给定的无序序列被构造成一个大的顶部堆。2.将堆顶元素与最后一个元素交换,以最大化最后一个。

 冒泡排序:
     通过相邻的两个数的比较, 根据需要决定是否将两个数互换位置, 然后将比较往前(或往后)推进. 最简单的排序算法,直接上代码。
  
七大经典排序(Java版)第1张七大经典排序(Java版)第2张
for(i=0;i<length-1;i++)
    for(j=i+1;j<length;j++)
    if(arrayVal[i]>arrayVal[j])
     {
             //置换位置
             temp=arrayVal[i];
             arrayVal[i]=arrayVal[j];
             arrayVal[j]=temp;
         }
}
View Code
 
选择排序:
    "选择排序"就是第0个逐步和后面全部的比,比完0位置就得到最小的数,紧接着再从1位置对比后面的元素,以此类推,逐步得到从小到大的值.
 
七大经典排序(Java版)第3张七大经典排序(Java版)第4张
for(int i = 0; i < arr.length - 1; i++) {        int k = i;    for(int j = k + 1; j < arr.length; j++){        if( arr[j] < arr[k]){        k =j;      }        //在内层循环结束,也就是找到本轮循环的最小的数以后,再进行交换    if( i != k) {     int temp= arr[i];    arr[i] = arr[k];    arr[k] = temp;    }
View Code
 
插入排序:
    首先对数组的前两个数据进行从小到大的排序。
    接着将第三个数据与排好序的两个数据比较,将第三个数据插入合适的位置。
    然后将第四个数据插入到已排好序的前3个数据中。
    ....
 
// 第1个数肯定是有序的,从第2个数开始遍历,依次插入有序序列
     
    public  static void insertionSort(int[] a){
  
          for(int i = 1 ; i < a.length; i++){
              
              int temp = a[i];
              int j = i - 1;
              while( j >= 0 && temp < a[j]){
                   a[j+1] = a[j];
                   j--;
              }  
              a[j+1] = temp;
     }

Shell排序算法:(希尔排序、缩小增量排序): 

  Shell排序是基于插入排序的思想。
    1.将有n个元素的数组分成n/2个数字序列,第1个数据和第n/2+1个数据为一对,...
    2.一次循环使每一个序列对排好顺序。
    3.然后,变为n/4个序列,在次排序。
    4.直到序列变为1个。
七大经典排序(Java版)第5张
   //希尔排序  
     public static void shellSort(int a[]){
          
          for(int r = a.length/2 ; r >= 1; r/=2 ){
              
              for(int i = r; i < a.length ; i++){
                   
                   int temp = a[i];
                   int j = i - r;
                   
                   while(j >= 0 && temp < a[j]){
                        a[j+r] = a[j];
                        j -= r;
                   }
                   
                   a[j+r] = temp;
              }
          }
     }

快速排序算法

    1.在待排序的元素任取一个元素作为基准(通常选第一个元素,但最的选择方法是从待排序元素中随机选取一个作为基准),称为基准元素;
       2.将待排序的元素进行分区,比基准元素大的元素放在它的右边,比其小的放在它的左边;
       3.对左右两个分区重复以上步骤直到所有元素都是有序的。
      
public static void quickSort3(int arr[],int _left,int _right){
          
        int left = _left;
        int right = _right;
        int temp = 0;
       
        if(left <= right){   //待排序的元素至少有两个的情况
          
            temp = arr[left];  //待排序的第一个元素作为基准元素
            while(left != right){   //从左右两边交替扫描,直到left = right
                while(right > left && arr[right] >= temp){
                   right --;        //从右往左扫描,找到第一个比基准元素小的元素
                }
                arr[left] = arr[right]; 
                while(left < right && arr[left] <= temp){
                   left ++;         //从左往右扫描,找到第一个比基准元素大的元素
                }
               
                arr[right] = arr[left]; 
            }
            arr[right] = temp;    //基准元素归位
            quickSort3(arr,_left,left-1);  //对基准元素左边的元素进行递归排序
            quickSort3(arr, right+1,_right);  //对基准元素右边的进行递归排序
           
        }       
    }

堆排序算法

  堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。
        堆:     
        堆是具有以下性质的完全二叉树:
        每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。

   七大经典排序(Java版)第6张

  堆排序的基本思想:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。

  堆排序的基本步骤:

    1.构造初始堆。将给定无序序列构造成一个大顶堆(一般升序采用大顶堆,降序采用小顶堆)。

    2.将堆顶元素与末尾元素进行交换,使末尾元素最大。然后继续调整堆,再将堆顶元素与末尾元素交换,得到第二大元素。如此反复进行交换、重建、交换。

   

public class HeapSort {
     
    public static void main(String []args){
        int []arr = {9,8,7,6,5,4,3,2,1};
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }
   
   
    public static void sort(int []arr){
        //1.构建大顶堆
        for(int i=arr.length/2-1;i>=0;i--){
            adjustHeap(arr,i,arr.length);
        }
       
        for(int j=arr.length-1;j>0;j--){
            swap(arr,0,j);
            adjustHeap(arr,0,j);
        }
    }
    
    // 调整大顶堆
    public static void adjustHeap(int []arr,int i,int length){
        int temp = arr[i];
        for(int k=i*2+1;k<length;k=k*2+1){
            if(k+1<length && arr[k]<arr[k+1]){
                k++;
            }
            if(arr[k] >temp){//如果子节点大于父节点,将子节点值赋给父节点
                arr[i] = arr[k];
                i = k;
            }else{
                break;
            }
        }
        arr[i] = temp;
    }
    //交换元素
    public static void swap(int []arr,int a ,int b){
        int temp=arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }
}
  归并排序
  归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。
  
public class MergeSort {

    public static void main(String []args){
        int []arr = {9,8,7,6,5,4,3,2,1};
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }

    public static void sort(int []arr){
        int []temp = new int[arr.length];//在排序前,先建好一个长度等于原数组长度的临时数组,避免递归中频繁开辟空间
        sort(arr,0,arr.length-1,temp);
    }

    private static void sort(int[] arr,int left,int right,int []temp){
        if(left<right){
            int mid = (left+right)/2;
            sort(arr,left,mid,temp);//左边归并排序,使得左子序列有序
            sort(arr,mid+1,right,temp);//右边归并排序,使得右子序列有序
            merge(arr,left,mid,right,temp);//将两个有序子数组合并操作
        }
    }

    private static void merge(int[] arr,int left,int mid,int right,int[] temp){
        int i = left;
        int j = mid+1;
        int t = 0;
        while (i<=mid && j<=right){
            if(arr[i]<=arr[j]){
                temp[t++] = arr[i++];
            }else {
                temp[t++] = arr[j++];
            }
        }
        while(i<=mid){
            temp[t++] = arr[i++];
        }
        while(j<=right){
            temp[t++] = arr[j++];
        }
        t = 0;
        //将temp中的元素全部拷贝到原数组中
        while(left <= right){
            arr[left++] = temp[t++];
        }
    }
}

各个排序算法比较:

      排序算法      平均速度     最坏情况     是否稳定
      冒泡排序     O( n^2)      O( n^2)          稳定
      快速排序     O(nlogn)      O( n^2)        不稳定
      选择排序     O( n^2)      O( n^2)        不稳定
      插入排序     O( n^2)      O( n^2)          稳定
        堆排序     O(nlogn)      O(nlogn)        不稳定
      Shell排序     O( n^(3/2) )      O( n^2)        不稳定
      合并排序     O(nlogn)      O(nlogn)          稳定

免责声明:文章转载自《七大经典排序(Java版)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇实现crontab定时调用python脚本,以及command not found的问题new一个接口下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

图像检索(image retrieval)

Where to Focus: Query Adaptive Matching for Instance Retrieval Using Convolutional Feature Maps Abstract 实例检索要求在大型语料库中搜索包含特定对象的图像。最近的研究表明,使用预训练的卷积神经网络(CNN)的池化卷积层特征图(CFMs)生成的图像特征...

数据结构学习——shell排序的C语言实现

shell排序:   这个排序的命名是来自发明者的名字,和排序的方法没有字面上的联系。所以不要因为名字而感觉很难。在K&R的C程序设计语言中书中只用了几行代码很简洁的实现了这个排序算法。那就来看看这个排序是如何实现的。 原理:   我们将所要排序的序列(大小为n)划分成组,组的数量一般是可以用这个序列的大小的一半来定义(也就是d = n/2),然...

某公司基于FineBI数据决策平台的试运行分析报告

一、数据平台的软硬件环境 二、组织机构和权限体系 组织机构:平台中已集成一套组织机构,可以建立部门、人员。也可以与现有系统的组织机构集成,将组织机构导入到平台中。 功能权限:通过配置功能点URL的方式实现各个用户相应的BI访问权限。用户第一次访问受保护的资源(某个功能点)时,会发出访问请求,服务器接收到请求后会验证用户权限,如果没有通过验证则返回登录页面...

SQL性能调优

部分转自:http://www.cnblogs.com/luckybird/archive/2012/06/11/2544753.html 及http://www.cnblogs.com/kissdodog/p/3160560.html 着色部分为实际解决问题的过程 最常见的索引问题查找: 1、检查实际执行计划,使用图形化或者在执行语句前增加  set s...

看懂SqlServer查询计划

对于SQL Server的优化来说,优化查询可能是很常见的事情。由于数据库的优化,本身也是一个涉及面比较的广的话题, 因此本文只谈优化查询时如何看懂SQL Server查询计划。毕竟我对SQL Server的认识有限,如有错误,也恳请您在发现后及时批评指正。 首先,打开【SQL Server Management Studio】,输入一个查询语句看看SQL...

数据库性能优化

MySQL基础表和数据 数据库访问优化法则 了解计算机系统的硬件基本性能指标,可以快速找到SQL的性能瓶颈点,下面是当前主流计算机性能指标数据。 从图上可以看到基本上每种设备都有两个指标: 延时(响应时间):表示硬件的突发处理能力; 带宽(吞吐量):代表硬件持续处理能力。 从上图可以看出,计算机系统硬件性能从高到代依次为: CPU——Cache(L1-L...