目录:
https://blog.csdn.net/stoneWang_L/article/details/89228145
1)冒泡排序
https://blog.csdn.net/stoneWang_L/article/details/89220461
2)插入排序
https://blog.csdn.net/stoneWang_L/article/details/89221348
3)选择排序
https://blog.csdn.net/stoneWang_L/article/details/89220638
5)堆排序
https://blog.csdn.net/stoneWang_L/article/details/89190250
6)归并排序
https://blog.csdn.net/stoneWang_L/article/details/89210938
7)希尔排序
https://blog.csdn.net/stoneWang_L/article/details/89217137
快速排序
思想:先选定一个基准数,然后从右到左找比这个基准数小的数,从左往右找比这个基准数大的数。交换这两个数的位置,然后继续找。一遍排序后,基准数的左边都是比他小的数,右边都是比他大的数。然后分为2部分,递归。
code:
1、QuickSort.java
package DataStr;
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int[] arr = SortTestHelper.getRandomArray(15, 0, 1);
System.out.println("快速排序前:"+Arrays.toString(arr));
quickSort(arr,0,arr.length-1); //递归版本
//noRecQuickSort(arr, 0, arr.length-1); //非递归版
System.out.println("快速排序后:"+Arrays.toString(arr));
}
/**
* 快速排序
* @param num 排序的数组
* @param left 数组的前针
* @param right 数组后针
*/
private static void quickSort(int[] arr, int left, int right) {
//如果left等于right,即数组只有一个元素,直接返回
if(left>=right) {
return;
}
//设置最左边的元素为基准值
int key=arr[left];
//数组中比key小的放在左边,比key大的放在右边,key值下标为i
int i=left;
int j=right;
while(i<j){
//j向左移,直到遇到比key小的值
while(arr[j]>=key && i<j){
j--;
}
//i向右移,直到遇到比key大的值
while(arr[i]<=key && i<j){
i++;
}
//i和j指向的元素交换
if(i<j) swap(arr, i, j);
}
arr[left]=arr[i];
arr[i]=key;
quickSort(arr,left,i-1);
quickSort(arr,i+1,right);
}
/**
* 非递归版快排
*/
private static void noRecQuickSort(int[] arr, int left, int right) {
if(left>=right) return;
//使用栈结构来存储一分为2的起始下标位置
LinkedList<Integer> stack = new LinkedList<Integer>();
stack.push(right); //压栈
stack.push(left);
while(!stack.isEmpty()) {
int l = stack.pop(); //出栈
int r = stack.pop();
int k = partitionSort(arr, l, r);
//将原来递归中,左部分的起始下标压入栈存储
if(l < k-1) {
stack.push(k-1);
stack.push(l);;
}
if(k+1 < r) {
stack.push(r);
stack.push(k+1);
}
}
}
private static int partitionSort(int[] arr, int left, int right) {
int key = arr[left], i = left, j = right;
while(i < j) {
while(arr[j] >= key && i < j) j--;
while(arr[i] <= key && i < j) i++;
if(i < j) swap(arr, i, j);
}
arr[left] = arr[i];
arr[i] = key;
return i;
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
2、测试数组辅助类
SortTestHelper.java
package DataStr;
public class SortTestHelper {
/**
*
* @param n 生成n个元素的随机数组
* @param rangeL 随机范围[rangeL
* @param rangeR rangeR]
* @return 返回一个随机 int 型数组
*/
public static int[] getRandomArray(int n, int rangeL, int rangeR) {
int[] arr = new int[n];
for(int i=0; i<n; i++) {
arr[i] = (int)(Math.random() * (rangeR - rangeL +1)) + rangeL;
}
return arr;
}
}
结果: