标签:
一、插入排序
算法导论上有很形象的比喻,把插入排序类比成扑克牌,默认你手里本身拥有的第一张是有序的,第二章和第一张对比后决定其位置,以此类推。代码如下:
1 public class InsertSort { 2 public void insertSort(int[] a){ 3 if(a==null||a.length==0||a.length==1){ 4 return ; 5 } 6 //i代表已有序的数组元素的边界, 7 for(int i = 0 ; i<a.length-1 ;i++){ 8 int j = i+1 ; 9 int temp = a[j];//保存j位置的元素 10 while(j>=1&&temp < a[j-1]){ 11 a[j] = a[j-1] ; 12 j-- ;//找到药插入的位置 13 } 14 a[j] = temp ; 15 } 16 } 17 public static void main(String[] args) { 18 InsertSort is = new InsertSort() ; 19 int[] a = {} ; 20 is.insertSort(a); 21 for(int i = 0 ; i < a.length ;i++){ 22 System.out.print(a[i]+" "); 23 } 24 } 25 26 }
二、希尔排序
希尔排序就是插入排序的一种变形,只不过希尔排序引入了步长的概念,数组中的数字一次移动的距离比直接插入排序要大,减少了数组移动操作的次数。
当步长为1时,希尔排序变成直接插入排序。代码如下
1 public class ShellSort { 2 public void shellSort(int[] a){ 3 int j = 0 ; 4 int temp = 0 ; 5 for(int d = a.length/2 ; d>0 ;d/=2){ 6 for(int i = d ; i < a.length ; i++){ 7 temp = a[i] ; 8 for(j = i ; j>=d ;j=j-d ){ 9 if(temp>a[i-d]){ 10 a[j] = a[j-d] ; 11 } 12 else{ 13 break ; 14 } 15 } 16 a[j] =temp ; 17 } 18 } 19 } 20 public static void main(String[] args) { 21 int[] a = {10,9,4,-1,7,9,5,6,2,-3} ; 22 ShellSort ss = new ShellSort() ; 23 ss.shellSort(a); 24 for(int i = 0 ; i<a.length ;i++){ 25 System.out.print(a[i]+" "); 26 } 27 }
三、堆排序
堆排序的时间复杂度是o(nlgn),但是空间复杂度是o(1),堆排序的主要操作就是建堆和调整,排序过程中也是将数组分成有序区和无序区,每次找出无序区中的最大(最小)值加入有序区。一切操作都是在数组上完成,切勿真的去建树,树是数组的逻辑结构。代码如下:
1 public class HeapSort { 2 public void heapSort(int[] a){ 3 if(a==null||a.length==0||a.length==1){ 4 return ; 5 } 6 for(int i = 0 ; i < a.length ;i++){ 7 createMaxHeap(a,a.length-1-i) ; 8 swap(a,0,a.length-1-i) ; 9 } 10 } 11 private void swap(int[] a, int i, int j) { 12 int temp = a[j]; 13 a[j] =a[i]; 14 a[i] = temp ; 15 } 16 private void createMaxHeap(int[] a, int lastIndex) { 17 for(int i = (lastIndex-1)/2 ; i>=0 ;i--){ 18 int k = i ; 19 while(2*k+1<=lastIndex){ 20 int biggerIndex = 2*k+1 ; 21 if(biggerIndex<lastIndex&&a[biggerIndex]<a[biggerIndex+1]){ 22 biggerIndex++ ; 23 } 24 if(a[k]<a[biggerIndex]){ 25 swap(a,k,biggerIndex); 26 k = biggerIndex ; 27 } 28 else{ 29 break ; 30 } 31 } 32 } 33 } 34 public static void main(String[] args) { 35 HeapSort hs = new HeapSort() ; 36 int[] a = {9,-1,0,3,6,7,2} ; 37 hs.heapSort(a); 38 for(int i = 0 ; i<a.length ;i++){ 39 System.out.print(a[i]+" ") ; 40 } 41 } 42 43 }
四、快排
快排每次的关键就是找到左边比标志大的节点,右边比标识小的节点,两者交换位置。
代码如下:
1 public class Qsort { 2 public void qSort(int[] a ,int left ,int right){ 3 if(a==null||a.length==0||a.length==1){ 4 return ; 5 } 6 int piovt = partion(a,left,right) ; 7 if(left<piovt){ 8 qSort(a,left,piovt-1) ; 9 } 10 if(right>piovt){ 11 qSort(a,piovt,right) ; 12 } 13 14 } 15 private int partion(int[] a, int left, int right) { 16 int index = a[(left+right)/2]; 17 while(left<right){ 18 while(a[left]<index){ 19 left++ ; 20 } 21 while(a[right]>index){ 22 right-- ; 23 } 24 if(left<=right){ 25 exchange(a,left,right) ; 26 left++ ; 27 right-- ; 28 } 29 } 30 return left; 31 } 32 private void exchange(int[] a, int left, int right) { 33 int temp = a[left] ; 34 a[left] = a[right] ; 35 a[right] = temp ; 36 } 37 public static void main(String[] args) { 38 Qsort qs = new Qsort() ; 39 int[] a = {5,9,2,1,4,0,-5,-7,-1} ; 40 qs.qSort(a, 0, a.length-1); 41 for(int i = 0 ;i<a.length ;i++){ 42 System.out.print(a[i]+" "); 43 } 44 45 } 46 47 }
五、归并排序
归并排序基于分治的思想,递归调用。代码如下:
1 public class MergeSort { 2 public void mergeSort(int[] a,int left ,int right){ 3 if(a==null||a.length==0||a.length==1){ 4 return ; 5 } 6 int middle = (left+right)/2; 7 if(left<right){ 8 mergeSort(a,left,middle); 9 mergeSort(a,middle+1,right) ; 10 } 11 merge(a,left,middle,right) ; 12 } 13 private void merge(int[] a, int begin, int middle, int end) { 14 int[] temp = new int[end-begin+1] ; 15 int i = 0 , j = begin , k = middle+1 ; 16 while(j<=middle&&k<=end){ 17 if(a[j]<=a[k]){ 18 temp[i] = a[j]; 19 j++ ; 20 } 21 else{ 22 temp[i] = a[k]; 23 k++ ; 24 } 25 i++ ; 26 } 27 while(j<=middle){ 28 temp[i] = a[j] ; 29 i++ ; 30 j++ ; 31 } 32 while(k<=end){ 33 temp[i] = a[k] ; 34 i++ ; 35 k++ ; 36 } 37 for(int l = 0 ; l < temp.length ;l++){ 38 a[begin+l] = temp[l] ; 39 } 40 } 41 42 public static void main(String[] args) { 43 int[] a = {3,9,1,2,6,0,-1,-4,15} ; 44 MergeSort ms = new MergeSort() ; 45 ms.mergeSort(a, 0, a.length-1); 46 for(int i = 0 ;i<a.length ;i++){ 47 System.out.print(a[i]+" "); 48 } 49 } 50 51 }
六、冒泡排序
每次找出无序序列的最小(最大)代码如下
1 public class BubbleSort { 2 public void bubbleSort(int[] a){ 3 if(a==null||a.length==0||a.length==1){ 4 return ; 5 } 6 for(int i = 0 ; i < a.length ;i++){ 7 for(int j = 1; j < a.length-i ;j++){ 8 if(a[j] < a[j-1]){ 9 exchange(a,j ,j-1) ; 10 } 11 } 12 } 13 } 14 private void exchange(int[] a, int j, int i) { 15 int temp = a[i] ; 16 a[i] = a[j]; 17 a[j] =temp ; 18 } 19 public static void main(String[] args) { 20 int[] a = {3,9,1,0,7,-4,-6} ; 21 BubbleSort bs = new BubbleSort() ; 22 bs.bubbleSort(a); 23 for(int i = 0 ; i < a.length ; i++){ 24 System.out.print(a[i]+" ") ; 25 } 26 } 27 28 }
七、选择排序
每次从数组中选出最大值(最小值)输出,代码如下:
1 public class SelectSort { 2 public void selectSort(int[] a){ 3 if(a==null||a.length==0){ 4 return ; 5 } 6 for(int i = 0 ; i < a.length ;i++){ 7 for(int j = i+1 ; j < a.length ;j++){ 8 if(a[j] < a[i]){ 9 exchange(a,i ,j) ; 10 } 11 } 12 } 13 } 14 private void exchange(int[] a, int i, int j) { 15 int temp = a[i]; 16 a[i] = a[j] ; 17 a[j] = temp ; 18 } 19 public static void main(String[] args) { 20 SelectSort ss = new SelectSort() ; 21 int[] a = {7,12,-1,3,7,9} ; 22 ss.selectSort(a); 23 for(int i = 0 ; i< a.length ;i++){ 24 System.out.print(a[i]+" "); 25 } 26 } 27 28 }
标签:
原文地址:http://www.cnblogs.com/huntertoung/p/4815009.html