一.冒泡排序
注:此处用了异或运算符
public static int[] sort(int[] arr) {
int temp = 0;
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
flag = true;
arr[j] = arr[j] ^ arr[j + 1];
arr[j + 1] = arr[j] ^ arr[j + 1];
arr[j] = arr[j] ^ arr[j + 1];
}
}
System.out.printf("第%d次排序:", i+1);
System.out.println(Arrays.toString(arr));
}
return arr;
}
优化思路:有可能在前几次排序后已经完成排序,但是仍然会进行判断。
如果未发生交换则排序已经完成,则可以退出排序
public static int[] sort(int[] arr) {
int temp = 0;
boolean flag = false;
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
flag = true;
arr[j] = arr[j] ^ arr[j + 1];
arr[j + 1] = arr[j] ^ arr[j + 1];
arr[j] = arr[j] ^ arr[j + 1];
}
}
if (flag != true) {
break;
} else {
flag=false;
}
System.out.printf("第%d次排序:", i+1);
System.out.println(Arrays.toString(arr));
}
return arr;
}
二.选择排序
在整个数组按照指定规则选择出一个元素放在排序的正确位置
public static int[] sort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int minIndex = 0;
int min = arr[i];
for (int j = i+1; j < arr.length; j++) {
if (min > arr[j]) {
min = arr[j];
minIndex = j;
}
}
if (minIndex != i) {
arr[minIndex] = arr[i];
arr[i] = min;
}
}
return arr;
}
三.插入排序
默认前i个元素是有序的让第i+1个元素插入前一个元素组成的有序数组中
public static int[] sort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
// 待插入的数
int insertVal = arr[i];
int insertIndex = i - 1; //待插入数前一个数
while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
arr[insertIndex + 1] = insertVal;
System.out.printf("第%d轮",i);
System.out.println(Arrays.toString(arr));
}
return arr;
}
四.希尔排序
1.交换法
public static int[] swapsSrt(int[] arr) {
int length = arr.length;
int temp = 0;
for (int gap = length / 2; gap > 0; gap /= 2) {
for (int i = gap; i < length; i++) {
for (int j = i - gap; j >= 0; j -= gap) {
if (arr[j] > arr[j + gap]) {
temp = arr[j];
arr[j] = arr[j + gap];
arr[j + gap] = temp;
}
}
}
}
return arr;
}
2.移动法
public static int[] moveSort(int[] arr) {
int length = arr.length;
int temp = 0;
for (int gap = length / 2; gap > 0; gap /= 2) {
for (int i = gap; i < length; i++) {
int j = i;
temp = arr[j];
if (arr[j] < arr[j - gap]) {
while (j - gap >= 0 && temp < arr[j - gap]) {
//移动
arr[j] = arr[j - gap];
j -= gap;
}
arr[j] = temp;
}
}
}
return arr;
}
五.归并排序
1.分
public static void mergeSort(int[] arr, int left, int right, int [] temp) {
if (left < right) {
int mid = (left + right) / 2;
//向左
mergeSort(arr, left, mid, temp);
//向右
mergeSort(arr, mid + 1, right, temp);
merge(arr,left,mid,right,temp);
}
}
2.治
public static void merge(int[] arr, int left, int mid, int right, int[] temp) {
int i = left;
int j = mid + 1;
int t = 0; //用于指向临时数组
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) {
temp[t] = arr[i];
t++;
i++;
} else {
temp[t] = arr[j];
t++;
j++;
}
}
//有剩余
while (i <= mid) {
temp[t] = arr[i];
i++;
t++;
}
while (j <= right) {
temp[t] = arr[j];
j++;
t++;
}
/**
* 拷贝到原数组
* 第一次 0 1
* 第二次 2 3
* 第三次 0 3
*/
t = 0;
int tempLeft = left;
while (tempLeft <= right) {
arr[tempLeft] = temp[t];
t++;
tempLeft++;
}
}
六.基数排序
public static int[] sort(int[] arr) {
int max = arr[0];
for (int i = 0; i < arr.length; i++) {
if (arr[i] > max) max = arr[i];
}
int maxNum = (max + "").length();
// 设置10个桶
int[][] bucket = new int[10][arr.length];
// 记录每个桶存放的数据
int[] bucketElement = new int[10];
for (int k = 0, n = 1; k < maxNum; k++, n *= 10) {
for (int i = 0; i < arr.length; i++) {
int digitOfElement = arr[i] / n % 10;
// 放入对应的桶中
bucket[digitOfElement][bucketElement[digitOfElement]] = arr[i];
bucketElement[digitOfElement]++;
}
// 按顺序取出放入原来的桶中
int index = 0;
for (int i = 0; i < bucketElement.length; i++) {
// 有数据就取出
if (bucketElement[i] != 0) {
for (int j = 0; j < bucketElement[i]; j++) {
arr[index++] = bucket[i][j];
}
}
bucketElement[i] = 0;
}
}
return arr;
}
七.快速排序
public static int[] sort(int[] arr, int left, int right) {
int l = left;
int r = right;
int temp = 0;
// 取中间值
int pivot = arr[(left + right) / 2];
while (l < r) {
while (arr[l] < pivot) {
l += 1;
}
while (arr[r] > pivot) {
r -= 1;
}
//左边全是小于pivot 右边全部大于pivot
if (l >= r) {
break;
}
//进行交换
// temp = arr[l];
// arr[l] = arr[r];
// arr[r] = temp;
arr[r] = arr[r] ^ arr[l];
arr[l] = arr[r] ^ arr[l];
arr[r] = arr[r] ^ arr[l];
if (arr[l] == pivot) {
r -= 1;
}
if (arr[r] == pivot) {
l += 1;
}
}
if (l == r) {
l += 1;
r -= 1;
}
//向左递归
if (left < r) {
sort(arr, left, r);
}
//向右递归
if (right > l) {
sort(arr, l, right);
}
return arr;
}