七大排序
- 交换排序
- 冒泡排序
- 快速排序
- 插入排序
- 直接插入排序
- 希尔排序
- 选择排序
- 直接选择排序
- 堆排序
- 归并排序
1、冒泡排序
每次比较相邻的两个元素,将较大的元素后移,每当将数组的数比较一次,最大的数都会出现在数组的最后,再对除去最后面数的前面的数进行重复操作,操作arr.length-1次即可
代码如下:
private static void bubbleSort(int[] arr){
for (int i = arr.length - 1; i > 0; i--){
for (int j = 0; j < i; j++){
// 相等不交换,保证稳定性
if (arr[j] > arr[j+1]){
swap(arr, j, j+1);
}
}
}
}
private static void swap(int[] arr, int a, int b){
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
2、快速排序
随机选择一个基准(一般选择第一个数),再设置两个辅助“指针”:i,j,i是第一个元素的index,j为最后一个元素的index。首先j开始向前移动,直到找到第一个比基准小的数index为止,然后i向后移动,直到找到第一个比基准大的数的index为止,交换i,j位置的元素;再重复上述操作,直到i>=j为止,此时将基准的值与i位置的值交换。则左边的都是比基准小的值,右边都是比基准大的值。再对左右两边进行同样的操作。
代码如下:
/**
*
* 快速排序:选择一个元素作为基准(一般选择第一个元素),begin指向开头,end指向末尾
* end负责找出比基准小的第一个元素,找出后,begin找出第一个比基准大的元素
* 交换两个元素,以此类推,直到begin和end碰到,交换基准与该位置的元素;
* 此时,该位置的左边是比基准小的元素,右边是比基准大的元素;以该位置作为
* 分隔点,对左边和右边进行相同的操作;当begin大于等于end的时候,跳出递归
*
* @param arr 目标数组
* @param begin 开始位置
* @param end 结束位置
*/
private static void quickSort(int[] arr, int begin, int end){
if (begin >= end){
return;
}
int standard = arr[begin];
int i = begin;
int j = end;
while (i < j){
while (i < j && arr[j] >= standard){
j--;
}
while (i < j && arr[i] <= standard){
i++;
}
if (i < j){
swap(arr, i, j);
}
}
swap(arr, begin, i);
quickSort(arr, begin, i-1);
qucikSort(arr, i+1, end);
}