//希尔排序(希尔排序可以说成是选择排序的优化)
public class Xr {
public static void main(String[] args) {
int[] arr={4,5,3,9,5,7};
xr(arr);
System.out.println(Arrays.toString(arr));
}
public static void xr(int[] arr) {
for(int gap=arr.length/2;gap>0;gap /=2) {
for(int i=gap;i<arr.length;i++) {
for(int j=i-gap;j>=0;j-=gap) {
if(arr[j]>arr[j+gap]) {
int temp=arr[j];
arr[j]=arr[j+gap];
arr[j+gap]=temp;
}
}
}
}
}
}
//基数排序
public class Tong {
public static void main(String[] args) {
int[] arr= {45,4,123};
tong(arr);
System.out.println(Arrays.toString(arr));
}
public static void tong(int[] arr) {
//第一步:找出最大值
int max=arr[0];
for (int a = 0; a < arr.length; a++) {
if(arr[a]>max) {
max=arr[a];
}
}
//第二步:找出最大的数值的长度
int maxLength=(max+"").length();
//第三步:进行桶排序
//定义一个二位数组表示桶
int[][] tong=new int[10][arr.length];
//定义一个辅助数组表示每个桶的存放数量
int[] fu=new int[10];
int n=1;
for (int i = 0; i < maxLength; i++) {
//将元素放入桶
for (int j = 0; j < arr.length; j++) {
int zhi=arr[j]/n%10;
tong[zhi][fu[zhi]]=arr[j];
fu[zhi]++;
}
int index=0;
for (int c = 0; c < fu.length; c++) {
if(fu[c]!=0) {
for(int k =0;k<fu[c];k++) {
arr[index++]=tong[c][k];
}
}
//将辅助数组中数据置空
fu[c]=0;
}
n=n*10;
}
}
}
堆排序
package com.qcby2;
import java.util.Arrays;
//堆排序
public class Dui {
public static void main(String[] args) {
int[] arr={2,4,5,3,9,5,1,999,54,48,7};
heapSoet(arr);
System.out.println(Arrays.toString(arr));
}
/**
* 创建堆
* @param arr
*/
public static void heapSoet(int[] arr){
for (int i = (arr.length -1) /2;i>=0;i--){
HeapSort(arr,i,arr.length);
}
// 调整堆的结构 + 让堆顶元素和堆尾元素进行交换
for (int i = arr.length-1; i>0;i--){
//将堆顶元素和堆尾元素进行交换
int temp = arr[i];
arr[i] = arr[0];
arr[0] = temp;
HeapSort(arr,0,i);
}
}
/**
* 调整大顶堆的方法
* @param arr
* @param parent 父指针
* @param length 数组长度
*/
public static void HeapSort(int[] arr,int parent,int length){
int temp = arr[parent];// 定义出父节点的值
int lChild = 2 * parent +1; // 如果当前节点不是叶子节点,那么一定有左子树(完全二叉树的性质)
while (lChild < length){
// 右孩子
int rChild = lChild +1;
//判断是否有右孩子节点,如果有我们让右孩子节点的值和左孩子节点的值进行对比
if(rChild < length && arr[lChild] < arr[rChild]){
lChild ++;
}
// 判断父节点的值和左指针的值
if(temp >= arr[lChild]){
break;
}
// 把孩子节点的值付给父节点
arr[parent] = arr[lChild];
parent = lChild;
lChild = 2 * lChild +1;
}
arr[parent] = temp;
}
}
//归并排序
package com.qcby2;
import java.util.Arrays;
public class Gui {
public static void main(String[] args) {
int[] arr = new int[]{2,4,5,3,87,45};
Sort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void Sort(int[] arr,int left,int right){
if(left >= right){
return;
}
int mid = (left + right) /2;
// 先递归左边
Sort(arr,left,mid);
// 在递归右边
Sort(arr,mid+1,right);
System.out.println(Arrays.toString(arr));
merge(arr,left,mid,right);
}
//合并
public static void merge(int[] arr,int left,int mid,int right){
// 定义指针s1
int s1 = left;
// 定义指针s2
int s2 =mid+1;
// 定义临时数组
int[] temp = new int[right - left +1];
int index =0; //临时数组的指针
//判断数组大小,将数组放入到临时数组当中去
while (s1<= mid && s2<=right){
if(arr[s1] <= arr[s2]){
temp[index] = arr[s1];
index ++;
s1 ++;
}else {
temp[index] = arr[s2];
index ++;
s2 ++;
}
}
// 判断 s1所值得数组当中有没有数据
while (s1 <= mid){
temp[index] = arr[s1];
index ++;
s1 ++;
}
// 判断 s2所值得数组当中有没有数据
while (s2 <=right){
temp[index] = arr[s2];
index ++;
s2 ++;
}
//将临时数组当中的数据放回原数组
for (int j =0;j<temp.length;j++){
System.out.println(left);
arr[j + left] = temp[j];
}
}
}