java的几种经典排序算法
排序算法大致有直接插入排序、折半插入排序、Shell排序、归并排序、直接选择排序、堆排序、冒泡排序、快速排序、桶式排序、基数排序等这些种,各个算法都有其优异性,大家不妨自己看看。下面贴上每个算法的简单讲解和实现:
1.直接选择排序(DirectSelectSort):其关键就是对n个数据要进行n-1趟比较,每趟比较的目的就是选择出本趟比较中最小的数据,并将选择出的数据放在本趟中的第一位。实现如下:
- <span style="font-size:18px;">public class DirectSelectSort {
- //排序方法
- public static void directSelectSort(int[] data){
- int minData = 0;
- int index = 0;
- //进行n-1趟比较
- for(int i=0; i<data.length-1; i++){
- minData = data[i];
- index = i;
- for(int j=i+1; j<data.length; j++){
- if(minData > data[j]){
- minData = data[j];
- index = j;
- }
- }
- //一趟比较完后,交换一次
- data[index] = data[i];
- data[i] = minData;
- }
- }
- public static void main(String args[]){
- int data[] = {22,34,12,32,50,67,43,32};
- System.out.print("排序前:");
- for(int i=0; i<data.length; i++){
- System.out.print(data[i]+" ");
- }
- System.out.println();
- directSelectSort(data);
- System.out.print("排序后:");
- for(int i=0; i<data.length; i++){
- System.out.print(data[i]+" ");
- }
- }
- }</span>
2.堆排序(HeapSort):先说下堆的概念,假设有n个数据元素的序列k0,k1,k2,k3,...,kn-1,当且仅当满足下列关系时,可以将这组数据称为小顶堆,即ki <= k2i+1且 ki<= k2i+2(其中i=0,2,4,...,(n-1)/2);或者,满足如下关系成为大顶堆,即ki >= k2i+1且 ki >= k2i+2(其中i=0,2,...,(n-1)/2)。如果将堆排成一棵完全二叉树,则小顶堆的特点是:树中所有节点的值都小于其左右节点的值,且根节点的值最小;而大顶堆相反。堆排序的关键在于:1.建堆(大顶堆或小顶堆)2.拿堆的根节点和最后一个节点交换。
- <span style="font-size:18px;">public class HeapSort{
- public static void heapSort(int[] data){
- //循环建堆
- for(int i=0; i<data.length-1; i++){
- buildMaxHeap(data, data.length-1-i);
- //交换栈顶和最后一个元素
- swap(data, 0, data.length-1-i);
- }
- }
- public static void buildMaxHeap(int[] data, int lastIndex){
- //从最后一个节点的父节点开始
- for(int i=(lastIndex-1)/2; i>=0; i--){
- //保存当前正在判断的节点
- int k = i;
- //如果当前k节点的子节点存在
- while(k*2+1 <= lastIndex){
- int biggerIndex = 2*k+1;
- if(biggerIndex < lastIndex){
- if(data[biggerIndex] < data[biggerIndex+1]){
- biggerIndex++;
- }
- }
- if(data[k] < data[biggerIndex]){
- //交换
- swap(data, k, biggerIndex);
- k = biggerIndex;
- }else{
- break;
- }
- }
- }
- }
- public static void swap(int[] data, int i, int j){
- int temp = data[i];
- data[i] = data[j];
- data[j] = temp;
- }
- public static void main(String[] args){
- int data[] = {22,34,12,32,50,67,43,32};
- System.out.print("排序前:");
- for(int i=0; i<data.length; i++){
- System.out.print(data[i]+" ");
- }
- System.out.println();
- heapSort(data);
- System.out.print("排序后:");
- for(int i=0; i<data.length; i++){
- System.out.print(data[i]+" ");
- }
- }
- }</span>
3. 冒泡排序(BubbleSort):冒泡排序是最简单的排序算法之一,实现起来也比较简单,其原理就是进行n-1趟比较并交换,小数往上冒,大数往下沉,经过n-1趟之后形成了有序的数列。
- <span style="font-size:18px;">public class BubbleSort {
- public static void bubbleSort(int[] data){
- for(int i=0; i<data.length-1; i++){
- for(int j=0; j<data.length-i-1; j++){
- if(data[j] > data[j+1]){
- int temp = data[j];
- data[j] = data[j+1];
- data[j+1] = temp;
- }
- }
- }
- }
- public static void main(String[] args){
- int data[] = {22,34,12,32,50,67,43,32};
- System.out.print("排序前:");
- for(int i=0; i<data.length; i++){
- System.out.print(data[i]+" ");
- }
- System.out.println();
- bubbleSort(data);
- System.out.print("排序后:");
- for(int i=0; i<data.length; i++){
- System.out.print(data[i]+" ");
- }
- }
- }
- </span>
4.快速排序(QuickSort): 快速排序死对 冒泡排序的一种改进,基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
- <span style="font-size:18px;">public class QuickSort {
- public static void quickSort(int[] data, int start, int end){
- if(start < end){
- //以第一个元素为分界值
- int middleNum = data[start];
- int i = start;
- int j = end + 1;
- while(true){
- //找到大于分界值的元素的索引或者已经到了end处
- while(i<end && data[++i] <= middleNum);
- //找到小于分界值的元素的索引或者已经到了start处
- while(j>start && data[--j] >= middleNum);
- if(i < j){
- //交换
- int temp = data[i];
- data[i] = data[j];
- data[j] = temp;
- }else{
- break;
- }
- }
- int temp = data[start];
- data[start] = data[j];
- data[j] = temp;
- //递归左子序列
- quickSort(data, start, j-1);
- //递归右子序列
- quickSort(data, j+1, end);
- }
- }
- public static void main(String[] args){
- int data[] = {22,34,12,32,50,67,43,32};
- System.out.print("排序前:");
- for(int i=0; i<data.length; i++){
- System.out.print(data[i]+" ");
- }
- System.out.println();
- quickSort(data, 0, data.length-1);
- System.out.print("排序后:");
- for(int i=0; i<data.length; i++){
- System.out.print(data[i]+" ");
- }
- }
- }
- </span>
5.直接插入排序(DirectInsertSort):直接插入排序的思路很简单,就是依次将带排序的数据元素按其关键字排序的大小插入前面的有序序列。
- <span style="font-size:18px;">public class DirectInsertSort {
- public static void directInsertSort(int[] data){
- for(int i=1; i<data.length; i++){
- for(int j=0; j<i; j++){
- if(data[i] < data[j]){
- //保存插入元素
- int temp = 0;
- temp = data[i];
- //将要插入元素位置后的元素依次往后移
- for(int m=i; m>j; m--){
- data[m] = data[m-1];
- }
- //插入元素
- data[j] = temp;
- }
- }
- }
- }
- public static void main(String[] args){
- int data[] = {22,34,12,32,50,67,43,32};
- System.out.print("排序前:");
- for(int i=0; i<data.length; i++){
- System.out.print(data[i]+" ");
- }
- System.out.println();
- directInsertSort(data);
- System.out.print("排序后:");
- for(int i=0; i<data.length; i++){
- System.out.print(data[i]+" ");
- }
- }
- }
- </span>