java 常见排序方法比较

1.冒泡排序

从第一个元素开始依次i与i+1元素相比较,若i元素较大,则交换两元素。这样一趟下来最大的元素就到了队尾,第二趟则从第一个元素比到第n-1个元素,这样倒数第二个元素就是从第一个到n-1个元素里最大的。以此类推,经过n-1趟,要比较n-1+n-2+...+1次,故时间复杂度=n*(n-1)/2,为O(n^2).

 1 public class Sort {
 2     public void BubbleSort(int n,int a[]) {
 3         for (int k = n - 1; k > 0; k--) {
 4             for (int i = 0; i < k; i++) {
 5                 if (a[i] > a[i + 1])
 6               exchange(a,i,i+1);
 7             }
 8         }
 9     }
10
11     public void exchange(int a[],int i,int j){
12         int temp=a[i];
13         a[i]=a[j];
14         a[j]=temp;
15     }
16 }
public class Main {

    public static void main(String[] args) {
        int N=20;
        int[] a=new int[20];
        System.out.println("排序前");
        for(int i=0;i<N;i++){
            a[i]=(int)(Math.random()*100+1);
            System.out.print(a[i]+"  ");
        }

        Sort sort =new Sort();
        sort.BubbleSort(N,a);

        System.out.println("\n冒泡排序后");
        for(int i=0;i<N;i++) System.out.print(a[i]+"  ");

    }
}

2.简单选择排序

简单选择排序就是从第一个元素开始,依次和后面每个元素进行对比,把其中较小的元素暂存,每个元素与这个前面比过的最小元素在进行比较,这样一轮下来,就知道最小元素了,把它和第一个元素交换,这样第一个就是最小的了。然后第二趟就是从第二个元素往后,这样一趟完了第二个元素就是后面n-1个元素里最小的......这样一共要进行n-1趟,每i趟比较n-i次,故n-1+n-2+...+1=n*(n-1)/2,故时间复杂度为O(n^2)。简单选择排序是不稳定的排序。

public void SimpleSort(int n,int a[]){    int minIndex;    for(int i=0;i<n-1;i++){        minIndex=i;        for(int j=i+1;j<n;j++){            if(a[j]<a[minIndex])minIndex=j;        }        exchange(a,i,minIndex);    }}
1        sort.SimpleSort(N,a);
2         System.out.println("\n排序后");
3         for(int i=0;i<N;i++) System.out.print(a[i]+"  ");

 3.快速排序

快速排序就是选择第一个数作为基准,然后比它小的元素全部放到它的左边,比它大的元素全部放到右边,再对左右两边递归进行这样的排序,直到等个序列都排完。

编写程序时需要有两个索引,类似于首尾的两个指针。

 1   public void  QuickSort(int a[],int start,int end){
 2         if(start<end) {
 3             int index = getMiddle(a, start, end);
 4             QuickSort(a, 0, index - 1);
 5             QuickSort(a, index + 1, end);
 6         }
 7     }
 8
 9     private int getMiddle(int a[],int start,int end){
10         int base=a[start];
11         while(start<end){
12             while(end>start&&a[end]>=base) end--;
13             a[start]=a[end];//start++;
14             while(end>start&&a[start]<=base) start++;
15             a[end]=a[start];//end--;
16         }
17         a[start]=base;
18         return start;
19     }
1         sort.QuickSort(a,0,N-1);
2         System.out.println("\n排序后");
3         for(int i=0;i<N;i++) System.out.print(a[i]+"  ");

注:快速排序是通常被认为在同数量级(O(nlog2n))的排序方法中平均性能最好的。但若初始序列按关键码有序或基本有序时,快排序反而蜕化为冒泡排序。

快速排序是一个不稳定的排序方法。

4.插入排序

插入排序就是依次扫描每个数,把它插到前面的有序队列里。从第二个数开始,第一个数就是一个有序队列。假设要比较第i个数了,那么就在它前面的序列从后往前扫描,如果那个数比它大的话,就让它后一个数等于它。依次扫描,等到某个数不大于这个数了,就把这个数插进去。一共进行n-1趟。时间复杂度T(n)=O()

 1   public void InsertSort(int n,int a[]){
 2         int i,j;
 3         int base;
 4         for(i=1;i<n;i++){//i是想往前已经排好的队列里插入的那个数
 5             base=a[i];
 6             j=i;
 7             while(j>0&&a[j-1]>base){
 8                     a[j]=a[j-1];
 9                     j--;
10             }
11             a[j]=base;
12         }
13     }

总结:

稳定的:冒泡排序,直接插入排序,归并排序,基数排序

不稳定:简单选择,快速排序,堆排序,希尔排序

时间: 2024-08-26 04:38:04

java 常见排序方法比较的相关文章

Java实现几种常见排序方法

转自:http://www.cnblogs.com/sevenyuan/archive/2009/12/04/1616897.html 日常操作中常见的排序方法有:冒泡排序.快速排序.选择排序.插入排序.希尔排序,甚至还有基数排序.鸡尾酒排序.桶排序.鸽巢排序.归并排序等. 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经

【转】Java实现几种常见排序方法

http://www.cnblogs.com/sevenyuan/archive/2009/12/04/1616897.html 日常操作中常见的排序方法有:冒泡排序.快速排序.选择排序.插入排序.希尔排序,甚至还有基数排序.鸡尾酒排序.桶排序.鸽巢排序.归并排序等. 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换

Java常见排序算法之归并排序

在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let‘s go~~~ 1.排序算法的基本概念的讲解 时间复杂度:需要排序的的关键字的比较次数和相应的移动的次数. 空间复杂度:分析需要多少辅助的内存. 稳定性:如果记录两个关键字的A和B它们的值相等,经过排序后它们相对的位置没有发生交换,那么我们称这个排序算法是稳定的. 否则我们称这个排序算法是不稳定的

Java常见排序算法之Shell排序

在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let‘s go~~~ 1.排序算法的基本概念的讲解 时间复杂度:需要排序的的关键字的比较次数和相应的移动的次数. 空间复杂度:分析需要多少辅助的内存. 稳定性:如果记录两个关键字的A和B它们的值相等,经过排序后它们相对的位置没有发生交换,那么我们称这个排序算法是稳定的. 否则我们称这个排序算法是不稳定的

java集合排序方法sort的使用

转自  http://blog.csdn.net/a1165117473/article/details/6965652 /** To change this template, choose Tools | Templates* and open the template in the editor.*/ package com.city.test; import java.util.Arrays;import java.util.Comparator;/**** @author LiuB*/

java List排序方法 Comparator和Comparable

今天写的一个程序中需要对一个List进行排序,突然发现自己对这个问题一无所知,于是查阅资料并进行测试,在此做个记录. Collections工具类中有两个方法可以对List进行排序,分别为: public static <T extends Comparable<? super T>> void sort(List<T> list) public static <T> void sort(List<T> list, Comparator<?

Java ArrayList排序方法详解

由于其功能性和灵活性,ArrayList是 Java 集合框架中使用最为普遍的集合类之一.ArrayList 是一种 List 实现,它的内部用一个动态数组来存储元素,因此 ArrayList 能够在添加和移除元素的时候进行动态的扩展和缩减.你可能已经使用过 ArrayList,因此我将略过基础部分.如果你对 ArrayList 还不熟悉,你可以参考它的 API 文档,可以很容易理解在 ArrayList 上执行基本的操作.In this post, I will discuss one of

常见排序方法整理

/** 建立一个用于操作数组的工具类,其中包含着常见的对数组的操作函数如:排序,最值等 @author jepson @version v1.0 */ public class ArrayTool { /*该类中的方法都是静态的,所以该类是不需要创建对象的, 为了保证不让其它程序创建该类对象 可以将该类的构造函数私有化. */ private ArrayTool(){} /** 对给定的整数数组进行直接插入排序 @param arr 接收一个元素类型为int的整数数组 */ public sta

Java一般排序方法,有一定的局限性。

例: public static void main(String[] args) {   int[] a ={3,1,4,22,0};    Arrays.sort(a);    for (int i = 0; i < a.length; i++){    System.out.print(a[i]+" ");   } }