Java实现排序算法

开始先介绍几种简单但是时间复杂度较高的算法选择、冒泡、插入排序,之后是复杂度较低的快速排序。
1、选择排序
一般策略:扫描整个表,找出最小值,将这个值与表中第一个位置的值相交换;继续扫描余下的表(除去第一个元素之外的所有值),找出最小值,将这个值与表中第二个位置的值相交换……直到最后完成排序。
复杂度:n²
代码实现:

    public int [] selectSort(int arr[]){
        for(int i=0;i<arr.length;i++){
            int minIndex=findMinIndex(arr,i);
            swap(arr,i,minIndex);
        }
        return arr; 
    }

2、冒泡排序
一般策略:扫描整个表,比较相邻的元素,如果他们的相互次序不正确,就交换他们。执行一次冒泡操作之后将最大值“冒泡”到表格的最后位置,这也是它在有序表中最终的位置。然后再次扫描表格,将第二个最大值冒泡到最终位置……知道最终排序完成。
复杂度:n²
代码实现:

public int [] bubbleSort(int []arr){
        for(int i=arr.length-1;i>0;i--){
            for(int j=0;j<i;j++){
                if(arr[j]>arr[j+1])
                    swap(arr,j,j+1);
                else
                    continue;
            }
        }
        return arr;
    }

3、插入排序
一般策略:
反复将一个个的具体的值插入到表的已有序的子表中,从而完成一组值的排序。(对表中前边两个元素进行排序,如果必要进行交换,然后将第3个值插入到前两个有序子段表的合适位置,之后第4个……都一样插入,直到排序完成(类比玩扑克牌一张张摸牌))
复杂度:n²
代码实现:

public int[] insertSort(int arr[]){// implemented by the linkedlist
        int []result =new int[arr.length];
        LinkedList list = new LinkedList<Integer>();
        list.add(arr[0]);
        for(int i=1;i<arr.length;i++){
            int j=0;
            while(j<list.size())
            {
                if(arr[i]<(int)list.get(j)){
                    list.add(j, arr[i]);
                    break;
                }
                else
                    j++;    
            }
            list.add(arr[i]);
        }
        for(int s=0;s<arr.length;s++){
            result[s]=(int)list.get(s);
        }
        return result;
    }

其中有关Linkedlist的有关方法详见JavaAPI下载JavaAPI点击此处

4、快速排序
一般策略:先选择表格中的一个元素为划分元素。接下来,对表进行划分,小于划分元素的值放在划分元素左边,大于划分元素的值放在划分元素右边。然后递归对左右两个分段进行排序。
有关递归点击此处
平均复杂度:n ㏒ n ,最坏情况复杂度:n²
代码实现:
关键在于parttition方法的处理

    public void quickSort(int arr[],int p,int r){
        if(p<r){
            int q=parttition(arr,p,r);
            quickSort(arr,p,q-1);
            quickSort(arr,q+1,r);
        }

    }


    //返回数组arr中从p到r位置的中间元素的索引,并且进行小于移左边,大于移右边操作。
    public int parttition(int arr[],int p,int r){
        int x=arr[r];
        int i=p-1;
        for(int j=p;j<r;j++){
            if(arr[j]<=x){
                i++;
                swap(arr,i,j);
            }
        }
        swap(arr,i+1,r);
        return i+1;
    }

整体代码:

import java.util.*;
public class Sort {

    public int [] selectSort(int arr[]){
        for(int i=0;i<arr.length;i++){
            int minIndex=findMinIndex(arr,i);
            swap(arr,i,minIndex);
        }
        return arr; 
    }

    public int [] bubbleSort(int []arr){
        for(int i=arr.length-1;i>0;i--){
            for(int j=0;j<i;j++){
                if(arr[j]>arr[j+1])
                    swap(arr,j,j+1);
                else
                    continue;
            }
        }
        return arr;
    }

    public int[] insertSort(int arr[]){// implemented  by the linkedlist
        int []result =new int[arr.length];
        LinkedList list = new LinkedList<Integer>();
        list.add(arr[0]);
        for(int i=1;i<arr.length;i++){
            int j=0;
            while(j<list.size())
            {
                if(arr[i]<(int)list.get(j)){
                    list.add(j, arr[i]);
                    break;
                }
                else
                    j++;    
            }
            list.add(arr[i]);
        }
        for(int s=0;s<arr.length;s++){
            result[s]=(int)list.get(s);
        }
        return result;
    }

    public void quickSort(int arr[],int p,int r){
        if(p<r){
            int q=parttition(arr,p,r);
            quickSort(arr,p,q-1);
            quickSort(arr,q+1,r);
        }

    }
    public int parttition(int arr[],int p,int r){
        int x=arr[r];
        int i=p-1;
        for(int j=p;j<r;j++){
            if(arr[j]<=x){
                i++;
                swap(arr,i,j);
            }
        }
        swap(arr,i+1,r);
        return i+1;
    }



//*******************************************************************************   
    public int findMinIndex (int arr[],int start)//找到最小值的索引
    {
        int min=arr[start];
        int result=start;
        int i=start;
        while(i<arr.length){
            if(arr[i]<=min){
                min=arr[i];
                result=i;
            }
            i++;
        }
        return result;
    }
//  *************************************************************************
    public void swap(int arr[],int x,int y)//交换数组arr中索引为x和y的两个元素
    {
        int temp=arr[x];
        arr[x]=arr[y];
        arr[y]=temp;
    }

    public void printArr(int []arr){
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+"   ");
        }
    }

    public static void main(String []args){
        int arr[]={1,3,5,7,9,2,4,6,8};
        int result[]=new int[arr.length];
        Sort s=new Sort();
        s.quickSort(arr, 0, arr.length-1);

        s.printArr(arr);
            }
        }

还有其他排序算法,比如归并排序、堆排序,以后再共同探讨。

猜你喜欢

转载自blog.csdn.net/ares_xxm/article/details/70832283