java实现各种排序算法

插入排序

public static void insertSort(int[] arr){
        for(int i = 0 ; i < arr.length ; i ++){
            int tmp = arr[i];
            int j = 0;
            for(j = i - 1; (j > -1) && (tmp < arr[j]) ; j --){
                arr[j + 1] = arr[j];
            }
            arr[j + 1] = tmp;
        }

起泡排序

    public static void bubbleSort(int[] arr){
        int length = arr.length - 1;
        int tmp = 0;
        boolean flag = false;
        while(length != 0){
            flag = false;
            for(int i = 0; i < length ; i ++){
                if(arr[i] > arr[i+1]){
                    tmp = arr[i];
                    arr[i] = arr[i+1];
                    arr[i+1] = tmp;
                    flag = true;
                }
            }
            System.out.println("第"+(arr.length-length)+"趟:"+Arrays.toString(arr));
            length--;

            if(flag == false){
                //这个过程中不曾出现数据交换的动作,说明数组已经是有序的了
                break;
            }
        }
    }

选择排序

(1):将序列分成有序区和无序区,初始时有序区为空,无序区包括全部元素
(2):每次从无序区中选择最小的元素将其与无序区第一个元素进行交换
(3):重复(2),直到无序区没有元素
    public static void selectSort(int[] arr){
        int tmp = 0;
        int index = 0;
        for(int i = 0 ; i < arr.length ; i ++){
            index = i;
            //查找[i...length]中的最小值
            for(int j = i + 1; j < arr.length; j ++){
                if(arr[index] > arr[j]){
                    index = j;
                }
            }
            //最小元素不是本身
            if(index != i){
                tmp = arr[index];
                arr[index] = arr[i];
                arr[i] = tmp;
            }
        }
    }

##归并排序


    public static void mergeSort(int[] list){
        if(list.length > 1){
            //合并左半部分
            int[] leftHalf = new int[list.length/2];
            System.arraycopy(list,0,leftHalf,0,list.length/2);
            mergeSort(leftHalf);

            //合并右半部分
            int rightHalfLength = list.length - list.length / 2;
            int[] rightHalf = new int[rightHalfLength];
            System.arraycopy(list,list.length / 2,rightHalf,0,rightHalfLength);
            mergeSort(rightHalf);

            int[] temp = merge(leftHalf,rightHalf);
            System.arraycopy(temp,0,list,0,temp.length);
        }
    }
    public static int[] merge(int[] list1,int[] list2){
        int[] temp = new int[list1.length + list2.length];
        int pos1 = 0;//list1游标
        int pos2 = 0;//list2游标
        int pos3 = 0;//temp游标

        while(pos1 < list1.length && pos2 < list2.length){
            if(list1[pos1] < list2[pos2]){
                temp[pos3++] = list1[pos1++];
            }else if(list1[pos1] > list2[pos2]){
                temp[pos3++] = list2[pos2++];
            }else{
                temp[pos3++] = list2[pos2++];
                temp[pos3++] = list1[pos1++];
            }
        }
        while(pos1 < list1.length){
            temp[pos3++] = list1[pos1++];
        }
        while(pos2 < list2.length){
            temp[pos3++] = list2[pos2++];
        }
        return temp;
    }

快速排序


    public static void quickSort(int[] arr,int low,int high){
        if(high > low){
            int part = partition(arr,low,high);
            //System.out.println("part="+part);
            quickSort(arr,low,part - 1);
            quickSort(arr,part+1,high);
        }
    }
    //找寻分界点
    public static int partition(int[] arr,int low , int high){
        int first = low;
        int pivot = arr[low];
        low++;
        while(high > low){
            //从左边找比pivot大的数
            while(low <= high && arr[low] <= pivot ){
                low++;
            }
            //从右边找比pivot小或等于的数
            while(high >= low && arr[high] > pivot ){
                high--;
            }
            //交换
            if(high > low){
                int temp = arr[high];
                arr[high] = arr[low];
                arr[low] = temp;
            }
        }
        //此时high = low - 1;
        //且high之前的元素都小于等于pivot,low之后的元素都大于pivot
        //System.out.println("low="+low+";high="+high+":"+Arrays.toString(arr));
        if(high > first){
            int temp = arr[high];
            arr[high] = arr[first];
            arr[first] = temp;
            //System.out.println("part="+high+":"+Arrays.toString(arr));
            return high;
        }else{
            //System.out.println("part="+high+":"+Arrays.toString(arr));
            return first;
        }
    }

堆排序

堆是一棵具有以下属性的二叉树
    1、一棵完全二叉树
    2、每个节点大于(小于)或等于它的任意一个孩子
    分类:大顶堆,小顶堆
    public static void heapSort(int arr[]){
        //初始化堆
        initHeap(arr);
        //System.out.println("初始化堆:" + Arrays.toString(arr));
        //end表示堆的结束位置
        int end = arr.length - 1;
        while(end > 0){
            //删除堆顶元素
            int temp = arr[0];
            arr[0] = arr[end];
            arr[end] = temp;
            end--;
            if(end > 0){
                //调整堆
                adjustHeap(arr,end);
            }
        }
    }
    public static void initHeap(int[] arr){
        //从0计数,则位置i的节点,左孩子在位置2i+1处,右孩子在位置2i+2处,而父节点在(i-1)/2处
        for(int i = 1 ; i < arr.length ; i ++){
            int current = i;
            while(current > 0){
                int parent = (current - 1) / 2;
                //孩子节点大于父节点,则交换位置
                if(arr[current] > arr[parent]){
                    int temp = arr[current];
                    arr[current] = arr[parent];
                    arr[parent] = temp;
                    //向上调整,跟新current
                    current = parent;
                }else{
                    break;
                }
            }
        }
    }
    public static void adjustHeap(int[] arr,int end){
        //删除堆顶元素后,调整堆顶的位置
        //需要知道的是,由于删除堆顶只是调整了堆顶的元素值,
        //因此除去堆顶之后,左右都是符合堆的树,
        //如此将堆顶元素向下调整的时候,如果检测到堆顶元素符合堆的定义时,
        //而由于它的左右子树始终是符合堆的定义,因此调整过程可以结束
        int current = 0;
        while(current < end){
            int left = current * 2 + 1;
            int right = current * 2 + 2;
            if(left <= end && right <= end){
                //左右节点都存在
                if(!(arr[current] >= arr[left] && arr[current] >= arr[right])){
                    //需要进行调整堆顶
                    int index = left;
                    if(arr[left] < arr[right]){
                        //左节点小于右节点
                        index = right;
                    }
                    int temp = arr[current];
                    arr[current] = arr[index];
                    arr[index] = temp;
                    current = index;
                }else{
                    //此时已经是堆了,无需继续向下调整
                    break;
                }
            }else if(left <= end && right > end){
                //左节点存在但右节点不存在
                if(arr[current] < arr[left]){
                    int temp = arr[current];
                    arr[current] = arr[left];
                    arr[left] = temp;
                    current = left;
                }else{
                    //此时已经是堆了,无需继续向下调整
                    break;
                }
            }else{
                //左右节点都不存在,已经调整到底了
                break;
            }
        }
    }
时间: 2024-10-22 21:10:06

java实现各种排序算法的相关文章

Java中各种排序算法

//插入排序:package org.rut.util.algorithm.support; import org.rut.util.algorithm.SortUtil;/** * @author treeroot * @since 2006-2-2 * @version 1.0 */public class InsertSort implements SortUtil.Sort{ /** (non-Javadoc) * @see org.rut.util.algorithm.SortUtil

Java中冒牌排序算法

冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面. 即首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后.重复以上过程,仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到最大数前的一对相邻数,将小数放前,大数放后,第二趟结束,在倒数第二个数中得到一个新的最大数.如此下去,直至最终

java的各种排序算法的分析及实现

一.插入排序 ?思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置,直到全部插入排序完为止. ?关键问题:在前面已经排好序的序列中找到合适的插入位置. ?方法: –直接插入排序 –二分插入排序 –希尔排序 ①直接插入排序(从后向前找到合适位置后插入) 1.基本思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置(从后向前找到合适位置后),直到全部插入排序完为止. java代码实现: package com.sort; public cla

Java常用的排序算法

转载自博客http://blog.csdn.net/xsf50717 排序算法 重要性不言而喻,很多算法问题往往选择一个好的排序算法往往问题可以迎刃而解 1.冒泡算法 冒泡排序(Bubble Sort)也是一种简单直观的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端.也就是双重循环就可以搞定的问题但是需

java实现各种排序算法及比较

常见排序算法包括以下七种:选择排序.冒泡排序.插入排序.快速排序.希尔排序.堆排序.归并排序. 在学习具体算法实现并进行比较前,先来学习算法比较的几个维度. 一是稳定性 所谓稳定性,是指值相等的两个元素在排序前后是否会发生位置的交换.如果不会发生交换,则认为是稳定的算法:反之,则认为是不稳定的排序算法. 二是时间复杂度,指执行算法所需的时间长短.简单说就是算法执行的快慢程序. 三是空间复杂度,指执行算法所占用的内存大小. 有了这些基本概念,下面就来看以上七种排序算法的java版实现 /** *

Java 8大排序算法

直接插入排序 //直接插入排序 public int[] insertSort(int[] a) { for (int i = 1; i < a.length; i++) { int j = i - 1; for (; j >= 0 && a[j] > a[i]; j--) { a[j + 1] = a[j];//往后移 } a[j + 1] = a[i]; } return a; } 希尔排序 //希尔排序 public int[] shellSort(int[] a)

Java实现八大排序算法

本文对常见的排序算法进行了总结. 常见排序算法如下: 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 它们都属于内部排序,也就是只考虑数据量较小仅需要使用内存的排序算法,他们之间关系如下: 稳定与非稳定: 如果一个排序算法能够保留数组中重复元素的相对位置则可以被称为是 稳定 的.反之,则是 非稳定 的. 直接插入排序 基本思想 通常人们整理桥牌的方法是一张一张的来,将每一张牌插入到其他已经有序的牌中的适当位置.在计算机的实现中,为了要给插入的元素腾出空间,我

经典(java版)排序算法的分析及实现之三简单选择排序

选择排序-简单选择排序 选择排序的基本思想是:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子系列的最后,直到全部记录排序完毕.简单选择排序也叫直接选择排序. 基本算法: 将给定待排序序列A[0....n],第一次从A[0]~A[n-1]中选取最小值,与A[0]交换,第二次从A[1]~A[n-1]中选取最小值,与A[1]交换,....,第i次从A[i-1]~A[n-1]中选取最小值,与A[i-1]交换,.....,第n-1次从A[n-2]~A[n-1]中选取最小值,与A[n-2]

Java学习笔记——排序算法之希尔排序(Shell Sort)

落日楼头,断鸿声里,江南游子.把吴钩看了,栏杆拍遍,无人会,登临意. --水龙吟·登建康赏心亭 希尔算法是希尔(D.L.Shell)于1959年提出的一种排序算法.是第一个时间复杂度突破O(n2)的算法之一. 其基础是插入排序. 上代码: 1 public class ShellSort { 2 3 public static void shellSort(int[] arr){ 4 5 int increment = arr.length; 6 int temp;//牌 7 int i; 8

java实现折半排序算法

折半插入排序法,又称二分插入排序法,是直接插入排序法的改良版,也需要执行i-1趟插入,不同之处在于,第i趟插入,先找出第i+1个元素应该插入的的位置,假定前i个数据是已经处于有序状态. 折半插入排序(binary insertion sort)是对插入排序算法的一种改进,由于排序算法过程中,就是不断的依次将元素插入前面已排好序的序列中.由于前半部分为已排好序的数列,这样我们不用按顺序依次寻找插入点,可以采用折半查找的方法来加快寻找插入点的速度.来自codego.net源码参考