交换排序的基本思想:两两比较待排序元素的关键字,发现两个元素的次序相反时即进行交换,直到没有反序的元素为止。冒泡排序是一种典型的交换排序的方法,而快速排序是通过交换方式以基准元素为分界线将待排数据序列一分为二的。
package com.gray;
import java.util.Arrays;
public class BubbleSort {
public static void main(String args[]) {
int a[] = {10, 6, 5, 3, 8, 9, 1, 4, 2, 7};
function(a);
System.out.println("排序后:" + Arrays.toString(a));
}
public static void function(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = arr.length - 1; j > i; j--) {
if (arr[j] < arr[j - 1]) {
int temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
}
}
}
}
}
快速排序(Quicksort)是对冒泡排序的一种改进。采用”分而治之“的思想所以也被称为分治法。但更好理解的应该是把它看做是挖坑填坑的过程。
package com.gray;
import java.util.Arrays;
import java.util.Stack;
public class Quicksort {
public static void main(String args[]) {
int a[] = {6, 10, 5, 3, 8, 9, 1, 4, 2, 7};
function(a);
System.out.println("排序后:" + Arrays.toString(a));
}
public static void function(int[] arr) {
quickSort(arr, 0, arr.length - 1);
}
private static void quickSort(int[] arr, int s, int t) {
int i = s;
int j = t;
int temp;
if (s < t) {
temp = arr[s];
while (i != j) {
while (j > i && arr[j] > temp)
j--;
arr[i] = arr[j];
while (i < j && arr[i] < temp)
i++;
arr[j] = arr[i];
}
arr[i] = temp;
quickSort(arr, s, i - 1);
quickSort(arr, i + 1, t);
}
}
}
2.非递归实现(没错,就是栈啦)
package com.gray;
import java.util.Arrays;
import java.util.Stack;
public class Quicksort {
public static void main(String args[]) {
int a[] = {6, 10, 5, 3, 8, 9, 1, 4, 2, 7};
function(a);
System.out.println("排序后:" + Arrays.toString(a));
}
private static void function(int[] arr) {
Stack stack = new Stack();
stack.push(0);
stack.push(arr.length - 1);
while (!stack.empty()) {
int j = stack.pop();
int i = stack.pop();
if (i < j) {
int k = quickSortNoRec(arr, i, j);
if (i < k - 1) {
stack.push(i);
stack.push(k - 1);
}
if (j > k + 1) {
stack.push(k + 1);
stack.push(j);
}
}
}
}
private static int quickSortNoRec(int[] arr, int s, int t) {
int i = s;
int j = t;
int temp;
if (s < t) {
temp = arr[s];
while (i != j) {
while (j > i && arr[j] > temp)
j--;
arr[i] = arr[j];
while (i < j && arr[i] < temp)
i++;
arr[j] = arr[i];
}
arr[i] = temp;
}
return i;
}
}