- 冒泡排序
原理:
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
private static void maopaoSort(Integer[] array){
for (int i = 0; i < array.length-1; i++) {
for (int j = 0; j < array.length-1-i; j++) {
if(array[j] > array[j+1]){ //如果前一个数比后一个数大,就交换位置
int temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
System.out.println("第"+(i+1)+"轮排序后的数组为: "+ Arrays.toString(array));
}
}
- 选择排序
原理:
选择排序原理即是,遍历元素找到一个最小(或最大)的元素,把它放在第一个位置,然后再在剩余元素中找到最小(或最大)的元素,把它放在第二个位置,依次下去,完成排序。
private static void selectSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int minIndex = i; // 用来记录最小值的索引位置,默认值为i
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j; // 遍历 i+1~length 的值,找到其中最小值的位置
}
}
// 交换当前索引 i 和最小值索引 minIndex 两处的值
if (i != minIndex) {
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
// 执行完一次循环,当前索引 i 处的值为最小值,直到循环结束即可完成排序
}
}
- 快速排序
原理:
快速排序主要用递归来实现
基于分治的思想,是冒泡排序的改进型。首先在数组中选择一个基准点(该基准点的选取可能影响快速排序的效率,后面讲解选取的方法),然后分别从数组的两端扫描数组,设两个指示标志(lo指向起始位置,hi指向末尾),首先从后半部分开始,如果发现有元素比该基准点的值小,就交换lo和hi位置的值,然后从前半部分开始扫秒,发现有元素大于基准点的值,就交换lo和hi位置的值,如此往复循环,直到lo>=hi,然后把基准点的值放到hi这个位置。一次排序就完成了。以后采用递归的方式分别对前半部分和后半部分排序,当前半部分和后半部分均有序时该数组就自然有序了。
quickSort(arr,0,arr.length-1);
private static void quickSort(Integer[] array,int low,int high){
int i = low;
int j = high;
int temp = array[i];
while (i<j){
while (temp <= array[j] && i<j){
j--;
}
while (temp >= array[i] && i<j){
i++;
}
if(i < j ){
int z = array[i];
int y = array[j];
array[i] = y;
array[j] = z;
}
}
array[low] = array[i];
array[i] = temp;
quickSort(array,low,j-1);
quickSort(array, j+1, high);
}
关注公众号
每周会更新干货知识