排序算法汇总分析
插入排序
插入排序是一种通过不断地把新元素插入到已排好序的数据中的排序算法,常用的插入排序算法包括直接插入排序和shell排序,直接插入排序实现比较简单,时间复杂度是O(n),但是直接插入没有充分的利用已插入的数据已经排序这个事实,因此有很多针对直接插入排序改进的算法,例如折半插入排序等,下边是直接插入排序的Java实现:
public static void insertSort(int[] elements){ for(int i = 1;i <elements.length; i++){ int j = -1; while(j <= i && elements[i] > elements[++j]);//找到element[i]应该摆放的位置,此处可以利用查找算法进行优化 if(j < i){ //将j之后的数据移动一位,然后把elements[i]移动到j处 int temp = elements[i]; for(int k = i-1;k >= j;k--){ elements[k+1] = elements[k]; } elements[j] = temp; } }}public static void shellSort(int[] elements){ for(int h = elements.length/2;h > 0;h /= 2){ for(int i = h;i < elements.length; i++){ int j = i % h; while(j <= i && elements[i] > elements[j]) j += h;//找到element[i]应该摆放的位置 if(j < i){ //将j之后的数据移动h位,然后把elements[i]移动到j处 int temp = elements[i]; for(int k = i-h;k >= j;k -= h){ elements[k+h] = elements[k]; } elements[j] = temp; } } }}package src;public class QSort {/** * @param args */public static void main(String[] args) {// TODO 自动生成方法存根quicksort qs = new quicksort();int data[] = {44,22,2,32,54,22,88,77,99,11};qs.data = data;qs.sort(0, qs.data.length-1);qs.display();}}class quicksort{public int data[];private int partition(int sortArray[],int low,int hight){int key = sortArray[low];while(low<hight){while(low<hight && sortArray[hight]>=key)hight--;sortArray[low] = sortArray[hight];while(low<hight && sortArray[low]<=key)low++;sortArray[hight] = sortArray[low];}sortArray[low] = key;return low;}public void sort(int low,int hight){if(low<hight){int result = partition(data,low,hight);sort(low,result-1);sort(result+1,hight);}}public void display(){for(int i=0;i<data.length;i++){System.out.print(data[i]);System.out.print(" ");}}}