排序算法

本文详细介绍了四种常见的排序算法:冒泡排序、快速排序、归并排序和选择排序。通过实例演示了每种算法的工作原理及其实现过程。

冒泡排序

package zll.material.sort_method;

import java.util.Arrays;
import org.junit.Test;


public class BubbleSort {
	/**
	 * 冒泡排序(Bubble sort)
	 * 1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
	 * 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
	 * 3.针对所有的元素重复以上的步骤,除了最后一个。
	 * 4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
	 */
	@Test
	public void test01(){
		int[] ints = {3,6,5,9,8,4,1,7,0};
		for(int i=0;i<ints.length-1;i++){
			for(int j=0;j<ints.length-1-i;j++){
				if(ints[j]>ints[j+1]){
					int tmp = ints[j];
					ints[j] = ints[j+1];
					ints[j+1] = tmp;
				}
			}
		}
		System.out.println(Arrays.toString(ints));
	}
}

 

快速排序

 

package zll.material.sort_method;

import java.util.Arrays;

import org.junit.Test;

public class FastSort {
	/** 
     * 快速排序(Fast sort) 
     * 快速排序的原理:选择一个关键值作为基准值。比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的)。一般选择序列的第一个元素。 
     *  
     * 一次循环:从后往前比较,用基准值和最后一个值比较,如果比基准值小的交换位置,如果没有继续比较下一个,直到找到第一个比基准值小的值才交换。 
     * 找到这个值之后,又从前往后开始比较,如果有比基准值大的,交换位置,如果没有继续比较下一个,直到找到第一个比基准值大的值才交换。直到从前 
     * 往后的比较索引>从后往前比较的索引,结束第一次循环,此时,对于基准值来说,左右两边就是有序的了。 
     *  
     * 接着分别比较左右两边的序列,重复上述的循环。 
     * @param a 
     * @param low 
     * @param high 
     */  
    public void fastSort(int[] a,int low,int high){  
        int start = low;  
        int end = high;  
        int key =a[low];  
        while(end>start){  
            //从前往后排序  
            while(end>start&&a[end]>key)  
                end--;  
            if(a[end]<key){  
                int tmp = a[end];  
                a[end] = key;  
                key = tmp;  
            }  
            //从后往前排序  
            while(end>start&&a[start]<key)  
                start++;  
            if(a[start]>key){  
                int tmp = a[start];  
                a[start] = key;  
                key = tmp;  
            }  
        }  
        if(start>low)fastSort(a, low, start-1);  
        if(end<high)fastSort(a, end+1, high);  
    }  
    /** 
     * 快速排序(Fast sort)测试 
     */  
    @Test  
    public void test02(){  
        int[] ints = {3,6,9,5,8,4,1,7,0};  
        fastSort(ints, 0, ints.length-1);  
        System.out.println(Arrays.toString(ints));  
    }  
}
public class test4 {
    public static void main(String[] args) {
        int [] arrs = {9,5,8,7,0,4,6,2,20,47,76,9,4};
        fastSort(arrs);
        System.out.println(Arrays.toString(arrs));
    }
    public static void fastSort(int[] arrs){
        QuickSort(arrs,0,arrs.length-1);
    }
    public static void QuickSort(int[] arrs,int start,int end){
        if(start<end){
            int index = getIndex(arrs,start,end);
            QuickSort(arrs,0,index-1);
            QuickSort(arrs,index+1,end);
        }
    }
    public static int getIndex(int[] arrs,int start,int end){
        int i=start;
        int j=end;
        int x=arrs[start];
        while (j>i){
            //先从右向左比,找比x小的
            while (j>i&&arrs[j]>x)j--;
            if(j>i){
                //把找到的元素放到第一个坑位
                arrs[i]=arrs[j];
                i++;
            }
            //从左向右比,找比x大的
            while (j>i&&arrs[i]<x)i++;
            if(j>i){
                arrs[j]=arrs[i];
                j--;
            }
        }
        arrs[i]=x;
        return i;
    }
}

归并排序

 

package zll.material.sort_method;

import java.util.Arrays;

import org.junit.Test;

public class MergeSort {
	/**
	 * 归并排序
	 */
	@Test
	public void test01(){
		int[] ints = {3,6,9,5,8,4,1,7,0}; 
		int[] results = mergeSort(ints);
		System.out.println(Arrays.toString(results));
	}

	private int[] mergeSort(int[] ints) {
		int[] tmp = new int[ints.length];
		mergeSort(ints,tmp,0,ints.length-1);
		return tmp;
	}

	private void mergeSort(int[] ints, int[] tmp, int left, int right) {
		int[] t = new int[right+1];
		if(left==right){
			tmp[left] = ints[left];
		}else{
			int mid = (left+right)/2;
			mergeSort(ints, t, left, mid);
			mergeSort(ints, t, mid+1, right);
			merge(t,tmp,left,mid,right);
		}
	}

	private void merge(int[] ints, int[] tmp, int left, int mid, int right) {
		int begin1 = left;
		int end1 = mid;
		int begin2 = mid+1;
		int end2 = right;
		int index = left;
		while (begin1<=end1&&begin2<=end2) {
			if(ints[begin1]<ints[begin2]){
				tmp[index]=ints[begin1];
				begin1++;
			}else {
				tmp[index]=ints[begin2];
				begin2++;
			}
			index++;
		}
		while (begin1<=end1) {
			tmp[index]=ints[begin1];
			begin1++;
			index++;
		}
		while (begin2<=end2) {
			tmp[index]=ints[begin2];
			begin2++;
			index++;
		}
	}
}

选择排序

package zll.material.java_base_homework;  
  
import java.util.Arrays;  
/*  
选择排序算法: 
首先在未排序序列中找到最小元素,存放到排序序列的起始位置 
 然后,再从剩余未排序元素中继续寻找最小元素,然后放到已排序序列的末尾。    以此类推,直到所有元素均排序完毕。 
 */    
public class D04 {  
    public static void main(String[] args) {  
         int[] a = new int[]{5,9,3,78,65,38};  
         selectSort(a);  
         System.out.println(Arrays.toString(a));  
    }  
  
    private static void selectSort(int[] a) {  
        if(a==null||a.length<=0){  
            return;  
        }  
        for(int i=0;i<a.length;i++){  
            int tmp = a[i];  
            int flag = i; // 将当前下标定义为最小值下标  
            for(int j=i+1;j<a.length;j++){  
                if(a[j]<tmp){// a[j] < temp 从小到大排序;a[j] > temp 从大到小排序  
                    tmp=a[j];  
                    flag=j;// 如果有小于当前最小值的关键字将此关键字的下标赋值给flag  
                }  
            }  
            if(flag != i){  
                a[flag]=a[i];  
                a[i]=tmp;  
            }  
        }  
    }  
}    

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值