1,冒泡排序
for(int i=0;i<arr.length-1;i++){
for(int j=0;j<arr.length-1-i;j++)
{
if(arr[j+1]<arr[j])
{
int t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
}
}
2,插入排序
public static void insertsort(int[] arr) {
for(int i=1;i<arr.length;i++) {
for(int j=0;j<i;j++){
if(arr[j]>arr[i]) {
int k = arr[i];
for(int c =i-1;c>=j;c--) {
arr[c+1]=arr[c];
}
arr[j] = k;
}
}
}
}
3,快速排序
public static void kp(int arr[],int left,int right) {
if(left >= right) {
return;
}
int i = left;
int j = right;
int base = arr[left];
while(i!= j) {
while(arr[j]>=base && i<j) {
j--;
}
while(arr[i]<=base && i<j) {
i++;
}
//i和j的值进行交换
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
arr[left] = arr[i];
arr[i] = base;
kp(arr,left,i-1);
kp(arr,i+1,right);
}
4,简单选择排序
public static void search(int[] arr) {
for(int i=0;i<arr.length;i++) {
int min = arr[i];
for(int j=i+1;j<arr.length;j++) {
if(min>arr[j]) {
int t = min;
min = arr[j];
arr[j] = t;
}
}
if(min != arr[i]) {
int temp = min;
min = arr[i];
arr[i] = temp;
}
}
}
5,堆排序
public class duipai {
public static void main(String[] args) {
int[] arr = {16, 7, 3, 20, 17, 8};
headSoet(arr);
System.out.println(Arrays.toString(arr));
}
//创建堆
public static void headSoet(int[] arr) {
for(int i=(arr.length-1)/2;i>=0;i--) {
HeadSort(arr, i, arr.length);
}
//调整堆结构+让堆顶元素和堆尾元素进行交换
for(int i=arr.length-1;i>0;i--) {
int temp = arr[i];
arr[i]=arr[0];
arr[0]=temp;
HeadSort(arr,0,i);
}
}
//调整大顶锥的方法
public static void HeadSort(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 = lchild *2+1;
}
arr[parent] = temp;
}
}
6,归并排序
public static void sort(int[] arr,int left,int right) {
if(left>=right) {
return;
}
if (left<right) { // 说明至少还存在两个元素:需要进行分
int mid = (left+ right) / 2; // 获得中间位置的下标(偏左)
sort(arr, left, mid); // 分操作:对左半部分的子序列递归调用
sort(arr, mid+1, right); // 分操作:对右半部分的子序列递归调用
// 治操作:解决有序两个子序列的合并
merge(arr, left, mid, right);
}
}
public static void merge(int[] arr,int left,int mid,int right) {
int s1 = left;
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++;
}
}
while(s1<=mid) {
temp[index]=arr[s1];
index++;
s1++;
}
while(s2<=right) {
temp[index]=arr[s2];
index++;
s2++;
}
for(int j=0;j<temp.length;j++) {
arr[j+left]=temp[j];
}
}
7,希尔排序
public static void sort(int[] arr) {
for(int gap = arr.length/2;gap>0;gap/=2) {
//第一轮,将10个数组分成两轮
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;
}
}
}
}
}
8,基数排序
public static void sort(int[] arr) {
//找到最大数值
int max = arr[0];
for(int i=0;i<arr.length;i++) {
if(arr[i]>max) {
max = arr[i];
}
}
//找到最大值是几位数
int maxlength = (max + "").length();
//定义二维数组表示桶
int[][] bucket = new int[10][arr.length];
int counts[] = new int[10];
//针对每一位
int n=1;
for (int h = 0;h<maxlength;h++){
for (int i= 0;i<arr.length;i++){
//取出每一个元素个位的值
int element = arr[i] / n % 10;
//放入到对应的桶当中
bucket[element][counts[element]] = arr[i];
counts[element]++;
}
int index =0; //index的目的是遍历元数组
// 将桶内的数据倒出来
for (int k = 0;k<10;k++){
//如果我们的桶当中有数据我们就将数据放入到原数组当中去
if(counts[k] !=0){
//便利桶,将桶内的数据放入到原数组
for (int j = 0;j<counts[k];j++){
arr[index ++] = bucket[k][j];
}
}
//处理完数组之后,将tempCounts置空
counts[k] = 0;
}
n = n *10;
}
}