这里我们用java实现3中经典的排序算法
1.冒泡排序
思想是简单易懂的.N
个数,排 N -1
趟,每趟都找出最大(或最小的)一个数,放到最后位置,这样在经过N-1
趟排序后,便是有序的了
/**
* 冒泡排序
* @param arr
* @return
*/
private static void bubbleSort(Integer[] arr){
for(int i = 1; i < arr.length; i++){
for(int j = 0; j < arr.length - i; j++){
if(arr[j] > arr[j+1]){
int temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
}
2.插入排序
思想也是简单的.排序从左往右依次进行,首先保证头2个数的有序,然后把第3个数拿出来,在头3个数中找到合适的位置插入进去,这样又保证了头3个数的有序,然后拿第4个数,第5个数。。。依次进行,最后就是有序的了。一样的N个数
排序N-1
趟
/**
* 插入排序
* @param arr
*/
private static void insertionSort(Integer[] arr){
// 外层循环为趟数
for(int i = 1; i < arr.length; i++){
int temp = arr[i];
int j;
// 第一趟比较前两个数,第二趟前三个数...
for(j = i; j > 0; j--){
if(temp < arr[j-1]){
arr[j] = arr[j-1];
} else {
break;
}
}
arr[j] = temp;
}
}
希尔排序
希尔排序其实就是对插入排序的优化.因为在插入排序中,如果存在很小的数在数组偏后的部分就会造成该数移动的位置太多,而希尔排序会选取一个增量(什么是增量不用管,待会会讲),每次数组中都会根据增量在小范围内进行插入排序,最后当增量=1时在整体进行一次插入排序,这样可以保证不会出现很小的数字出现在数组后部分的情况,因为在前几次的排序中已经做好排序了。
/**
* 希尔排序 12,31,23,45,86,34,78,2,97,3,21 5,2,1 a[11] 12
* @param arr
*/
private static void shellSort(Integer[] arr){
/**
* 增量
*/
for(int gap = arr.length / 2; gap > 0; gap /= 2){
for(int i = 0; i < arr.length - gap; i++){
int tar = arr[i + gap];
int j;
for(j = i + gap; j > 0; j--){
if(tar < arr[j - 1]){
arr[j] = arr[j - 1];
} else {
break;
}
}
arr[j] = tar;
}
}
}