数组排序-冒泡排序-选择排序-插入排序-希尔排序-快速排序-Java实现
这五种排序算法难度依次增加。
冒泡排序:
第一次将数组相邻两个元素依次比较,然后将大的元素往后移,像冒泡一样,最终最大的元素被移到数组的最末尾。
第二次将数组的前n-1个元素取出,然后相邻两个元素依次比较,将大的元素往后移,最终n-1个元素中最大的元素又在末尾。
重复上面的步骤,直到数组只有1个元素为止。因为每次都将上一次比较剩下的最大元素放到末尾,所以当所有比较结束的时候,排序结束。
1 public void bubbleSort(T[] array) 2 { 3 for(int i = array.length-1;i>0; i--) 4 { 5 for(int j = 0; j <i; j++) 6 { 7 if(array[j].compareTo(array[j+1]) > 0) 8 { 9 T temp = array[j]; 10 array[j] = array[j+1]; 11 array[j+1] = temp; 12 } 13 } 14 } 15 }
二)选择排序
选择排序和冒泡排序类似,只是每次循环的时候将最大的元素位置记下来,然后当循环结束的时候,将最大的元素与最末尾元素进行调换。这样,当所有循环结束的时候,数组排序也结束。
1 @Override 2 public void selectionSort(T[] array) 3 { 4 for(int i = array.length-1; i>0; i--) 5 { 6 int max = 0; 7 for(int j = 0; j <= i; j++) 8 { 9 if(array[max].compareTo(array[j]) < 0) 10 { 11 max = j; 12 } 13 } 14 15 T temp = array[max]; 16 array[max] = array[i]; 17 array[i] = temp; 18 } 19 }
三)插入排序
插入排序的思想是遍历整个数组,从第一个元素开始,在遍历过程中将该元素与之前元素比较,将它插入到之前元素的中间,要求是该元素大于前面所有元素,且小于等于后面所有元素。
1 @Override 2 public void insertionSort(T[] array) 3 { 4 this.insertionSort(array,0,array.length); 5 } 6 7 8 @Override 9 public void insertionSort(T[] array, int start, int length) 10 { 11 for(int i = start; i < start+length;i++) 12 { 13 for(int j = start; j < i; j++) 14 { 15 if(array[i].compareTo(array[j]) < 0) 16 { 17 T temp = array[i]; 18 for(int k = i; k > j; k--) 19 { 20 array[k] = array[k-1]; 21 } 22 array[j] = temp; 23 } 24 } 25 } 26 }
四)希尔排序
希尔排序是插入排序的升级版。希尔排序会设置一个步长gap,然后不断减小gap,直到gap为1。而每次将数组中长度为gap的元素进行排序。其实就是先对数组进行局部排序,使得数组在总体上有序的,这样在插入排序的时候就不需要进行大规模的数据移动。
1 @Override 2 public void shellSort(T[] array) 3 { 4 int gap = array.length/2; 5 while(gap >=1) 6 { 7 for(int i = gap; i<array.length; i++) 8 { 9 this.insertionSort(array, i-gap, gap+1); 10 } 11 gap = gap/2; 12 } 13 }
五)快速排序
快速排序会使用到分治法和递归思想。每次排序的时候,选取一个元素,将所有小于它的元素放到左边,将所有大于它的元素放到它的右边。然后将左边和右边的元素分别看成一个数组,然后递归将剩余的元素按照之前的方式排序。当数组长度为1的时候,递归结束,整个数组排序也完成。
1 @Override 2 public void quickSort(T[] array) 3 { 4 this.quickSortInternal(array, 0, array.length-1); 5 } 6 7 private void quickSortInternal(T[] array, int left, int right) 8 { 9 if(left >= right) 10 { 11 return; 12 } 13 14 int _left = left; 15 int _right = right; 16 17 boolean flag = false; 18 while(left!=right) 19 { 20 if(flag == false) 21 { 22 //从右向左逼近 23 if(array[right].compareTo(array[left]) < 0) 24 { 25 T temp = array[left]; 26 array[left] = array[right]; 27 array[right] = temp; 28 //交换后 应该调换方向 29 flag = !flag; 30 } 31 right--; 32 } 33 else 34 { 35 //从左向右逼近 36 if(array[left].compareTo(array[right]) > 0) 37 { 38 T temp = array[left]; 39 array[left] = array[right]; 40 array[right] = temp; 41 //交换后 应该调换方向 42 flag = !flag; 43 } 44 left++; 45 } 46 } 47 //递归 48 this.quickSortInternal(array, _left, left-1); 49 this.quickSortInternal(array, right+1, _right); 50 } 51 }