/**
* 选择排序
* @author Administrator
*
*/
public class ChooseSortMain {
public static void main(String[] args) {
int[] arr = {1,9,3,12,7,8,3,4,65,22};
chooseSort(arr);
for(int i:arr){
System.out.print(i+",");
}
}
private static void chooseSort(int[] arr) {
int temp;
for (int i = 0; i < arr.length; i++) {
int k = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[k] > arr[j]) {
k = j;
}
}
if (i != k) {
temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
}
}
}
//堆排序
public class HeapSortMain {
public static void main(String[] args) {
System.err.println(System.getProperty("java.class.path"));
int[] arr = {1,9,3,12,7,8,3,4,65,22};
print(arr);
System.out.println();
heapSort(arr);
print(arr);
}
private static void print(int[] arr){
for(int i:arr){
System.out.print(i+",");
}
System.out.println();
}
private static void heapSort(int[] arr) {
/****
* 其实这个方法也是为了找到最大的那个元素
*/
buildHeap(arr);
for (int i = arr.length - 1; i >= 0; i--) {
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
adjustHeap(arr, 0, i);
// System.out.format("第 %d 趟: \t", arr.length - i);
}
}
/**
*
* parent(i) = (i-1) /2;
* left(i) = i * 2 + 1;
* right(i) = i * 2 + 2;
*
* */
private static void buildHeap(int[] arr){
for(int i = arr.length /2 ;i >=0;i--){
adjustHeap(arr, i, arr.length);
}
}
/**
* 以parent为跟节点,找到最大的数
* @param arr
* @param parent
* @param length
*/
private static void adjustHeap(int[] arr,int parent,int length){
int temp = arr[parent];
int child = parent * 2 + 1;
while(child < length){
// 如果有右孩子结点,并且右孩子结点的值大于左孩子结点,则选取右孩子结点
if (child + 1 < length && arr[child] < arr[child + 1]) {
child ++;
}
// 如果父结点的值已经大于孩子结点的值,则直接结束
if (temp >= arr[child]) {
break;
}
//左右孩子节点大于父节点
arr[parent] = arr[child];
//以大孩子节点为父节点 往下面找
parent = child ;
child = parent * 2 + 1;
print(arr);
}
arr[parent] = temp;
}
}
/**
* 插入排序
* @author Administrator
*
*/
public class InsertSortMain {
public static void main(String[] args) {
int[] arr = {1,9,3,12,7,8,3,4,65,22};
insertSort(arr);
for(int i:arr){
System.out.print(i+",");
}
}
private static void insertSort(int[] arr) {
int j ;
for (int i = 1; i < arr.length; i++) {
int taget = arr[i];
j = i;
while(j > 0 && arr[j] < arr[j -1]){
arr[j] = arr[j-1];
j --;
}
arr[j] = taget;
}
}
}
/*
* 冒泡排序
*/
public class MaopaoPaixuMain {
public static void main(String[] args) {
int[] arr = {1,9,3,12,7,8,3,4,65,22};
maopaoSort(arr);
for(int i:arr){
System.out.print(i+",");
}
}
private static void maopaoSort(int[] arr){
int temp ;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length- 1 -i; j++) {
//最重要的一点就是跟旁边的元素比较
if (arr[j] > arr[j+1]) {
temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
}
}
/**
* 快速排序
* @author Administrator
*
*/
public class QuickSortMain {
public static void main(String[] args) {
System.err.println("aaaab" == "aaaab");
/*int[] arr = {9,1,3,2,7,8,3,4,65,22};
quickSort(arr, 0, arr.length -1);
for(int i:arr){
System.out.print(i+",");
}*/
}
//9,1,3,2,7,8,3,4,65,22
//9,1,3,2,7,8,3,4,65,22
private static int findIndex(int[] arr,int low,int high){
int i = low;
int j = high;
int key = arr[low];
while(i < j){
//从左边到右,找到第一个小于key的数 找到再说
while(arr[j] >= key && i < j){
j--;
}
//从右到左,找到第一个大于于key的数 找到再说
while(arr[i] <= key && i < j){
i++;
}
//开始交换
if (i < j) {
int a = arr[i];
arr[i] = arr[j];
arr[j] = a;
}
}
//最重要的一点来了 走到这里的话 就是i j相等了 这时候就要调整key的位置了
arr[low] = arr[i];
arr[i] = key;
return i;
}
/**
* 快速排序
* @param array
* @param lo
* @param hi
*/
public static void quickSort(int[] array,int lo ,int hi){
if(lo>=hi){
return ;
}
//进行第一轮排序获取分割点
int index=findIndex(array,lo,hi);
//排序前半部分
quickSort(array, lo, index - 1);
//排序后半部分
quickSort(array,index+1,hi);
}
}