//快速排序
public static void qSort(int[] data, int left, int right) {
int base = data[left]
int ll = left
int rr = right
while (ll < rr) {
// 从后面往前找比基准数小的数
while (ll < rr && data[rr] >= base) {
rr--
}
if (ll < rr) { // 表示是找到有比之大的
int temp = data[rr]
data[rr] = data[ll]
data[ll] = temp
ll++
}
System.out.println("left:" + ll + "right:" + rr + Arrays.toString(data))
while (ll < rr && data[ll] <= base) {
ll++
}
if (ll < rr) {
int temp = data[rr]
data[rr] = data[ll]
data[ll] = temp
rr--
}
System.out.println("left:" + ll + "right:" + rr + Arrays.toString(data))
}
// 肯定是递归 分成了三部分,左右继续快排,注意要加条件不然递归就栈溢出了
if (left < ll)
qSort(data, left, ll - 1)
if (ll < right)
qSort(data, ll + 1, right)
}
// 选择排序
/**
* 选择排序
*
* @param a 核心思想:选择排序的核心思想是通过反复遍历未排序部分,
* 找到其中的最小(或最大)元素,并将其放到已排序部分的正确位置。
* 这样,经过多次遍历后,数组就会变得有序
*/
public static void selectSort(int[] a) {
for (int i = 0
int s = i
for (int j = s + 1
if (a[s] > a[j]) {
s = j
}
}
if (s != i) { // 说明下标替换了 需要交换元素值
int temp = a[s]
a[s] = a[i]
a[i] = temp
}
System.out.println(Arrays.toString(a))
}
}
//冒泡排序
private static void sort(int[] arr) {
for (int i = 0
for (int j = 0
if (arr[j] > arr[j + 1]) {
exchange(arr, j, j + 1)
}
}
System.out.println(Arrays.toString(arr))
}
}
private static void exchange(int[] nums, int i, int j) {
int temp = nums[i]
nums[i] = nums[j]
nums[j] = temp
}
/**
* 插入排序
* 核心思想:工作原理类似于整理扑克牌。它通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入
* 6, 4, 3, 9, 4, 5, 7, 8
* 第1次的排序结果为:4 6 3 9 4 5 7 8
* 第2次的排序结果为:3 4 6 9 4 5 7 8
* 第3次的排序结果为:3 4 6 9 4 5 7 8
* 第4次的排序结果为:3 4 4 6 9 5 7 8
* 第5次的排序结果为:3 4 4 5 6 9 7 8
* 第6次的排序结果为:3 4 4 5 6 7 9 8
* 第7次的排序结果为:3 4 4 5 6 7 8 9
*/
private static void insertSort(int[] nums) {
int n = nums.length
for (int i = 1
int data = nums[i]
int j = i - 1
for (
if (nums[j] > data) {
nums[j + 1] = nums[j]
} else {//因为前面已经是排好序的 那么找到一个比他小的就不用找了,因为前面的肯定更小
break
}
}
System.out.println(j)
nums[j+1]=data
System.out.print("第" +i +"次的排序结果为:")
for(j = 0
System.out.print(nums[j]+" ")
}
System.out.println()
}
}
/**
* 归并排序
* 核心思想是将数组分成更小的子数组,分别排序后再合并成一个有序数组
*/
public static void megerSort(int data[], int left, int right) { // 数组的两端
if (left < right) { // 相等了就表示只有一个数了 不用再拆了
int mid = (left + right) / 2
megerSort(data, left, mid)
megerSort(data, mid + 1, right)
// 分完了 接下来就要进行合并,也就是我们递归里面归的过程
meger(data, left, mid, right)
}
}
public static void meger(int data[], int left, int mid, int right) {
int temp[] = new int[data.length]
int point1 = left
int point2 = mid + 1
int loc = left
while(point1 <= mid && point2 <= right){
if(data[point1] < data[point2]){
temp[loc] = data[point1]
point1 ++
loc ++
}else{
temp[loc] = data[point2]
point2 ++
loc ++
}
}
while(point1 <= mid){
temp[loc ++] = data[point1 ++]
}
while(point2 <= right){
temp[loc ++] = data[point2 ++]
}
for(int i = left
data[i] = temp[i]
}
}