排序算法 - 1835434698/1835434698.github.io GitHub Wiki

1、冒泡排序 基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

public class bubbleSort {
	public bubbleSort(){
    	int a[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};
		int temp=0;
		for(int i=0;i<a.length-1;i++){
			for(int j=0;j<a.length-1-i;j++){
				if(a[j]>a[j+1]){
					temp=a[j];
					a[j]=a[j+1];
					a[j+1]=temp;
				}
			}
		}
	for(int i=0;i<a.length;i++){  
   		System.out.println(a[i]);
   	}
}

2、快速排序 基本思想:选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。两端同时向中间移动。

public class quickSort {
	int a[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};
	publicquickSort(){
    	quick(a);
		for(int i=0;i<a.length;i++){
			System.out.println(a[i]);
		}
	}

	public int getMiddle(int[] list, int low, int high) {    
		int tmp =list[low];    //数组的第一个作为中轴    
    	while (low < high){    
        	while (low < high&& list[high] >= tmp) {    
            	high--;    
         	}    
         	list[low] =list[high];   //比中轴小的记录移到低端    
         	while (low < high&& list[low] <= tmp) {    
            	low++;    
         	}    
         	list[high] =list[low];   //比中轴大的记录移到高端    
     	}    
     	list[low] = tmp;              //中轴记录到尾    
     	return low;                   //返回中轴的位置    
	}   

	public void _quickSort(int[] list, int low, int high) {    
		if (low < high){    
            int middle =getMiddle(list, low, high);  //将list数组进行一分为二    
            _quickSort(list, low, middle - 1);       //对低字表进行递归排序    
            _quickSort(list,middle + 1, high);       //对高字表进行递归排序    
		}    
	}  

	public void quick(int[] a2) {    
        if (a2.length > 0) {    //查看数组是否为空    
            _quickSort(a2,0, a2.length - 1);    
        }    
    }
}

3、插入排序 从第二个数开始,依次向右取一个数与前面所有数对比,插入合适位。

 /** * 插入排序 * 
 * @param a 
 * @return 
 */ 

public int[] insertSort(int[] a) {
	int n = a.length; 
	if (n <= 1) {
		return a; 
	} 
	for (int i = 1; i < n; i++) { 
		int temp = a[i]; 
		int j = i - 1; 
		for (; j >= 0; j--) { 
			if (a[j] > temp) { 
				a[j + 1] = a[j]; // 比temp 大的已排序数据后移一位 
			} else { 
				break; 
			} 
		} 
		a[j + 1] = temp; // 空出来的位置,把temp放进去 
	} 
	return a; 
} 

4、选择排序算法 基本逻辑是:把所有数据分为已排序区间和未排序区间。每次从未排序区间中,选出最小值,之后将该值与未排序区间第一个元素互换位置,此时已排序区间元素个数多了一个,未排序区间内的元素少了一个。如此循环直到未排序区间没有元素为止。

 /** 
 * 选择排序 
 * @param a 
 * @return 
 */ 
 public int[] selectionSort(int[] a) { 
 	int n = a.length; 
 	if (n <= 1) { 
 		return a; 
 	} 
 	for (int i =1; i < n; i++) { 
        int j = i-1; 
        int min = a[j]; // 最小的数值 
        int index = j; // 最小值对应的下标 
        for (; j < n-1 ; j++) { 
            if (min > a[j+1]) { 
                min = a[j+1]; 
                index = j+1; 
            } 
        } //最小值a[index]与放未排序的首位a[i-1]互换位置 
        if (index != i-1) { 
            int temp = a[i-1]; 
            a[i-1] = a [index]; 
            a [index] = temp; 
        }
    } 
	return a; 
}