排序算法全(Java)
2021-04-18 04:30
标签:static pre 分组 quic loading item tostring 一般来说 空间 排序算法 冒泡排序(Bubble Sort)--稳定 实质:把小(大)的元素往前(后)调 步骤一:比较相邻的元素。如果第一个比第二个大,就交换他们两个。 步骤二:对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 步骤三: 针对所有的元素重复以上的步骤,除了最后一个。 步骤四: 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 选择排序(Selection Sort)--不稳定 步骤一:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置 步骤二:再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。 步骤。。。 :以此类推,直到所有元素均排序完毕。 插入排序(Insertion Sort)--稳定 适用于已经有部分数据已经排好,并且排好的部分越大越好。一般在输入规模大于1000的场合下不建议使用插入排序 基本思想: 希尔排序(Shell‘s Sort) --不稳定 是直接插入排序算法的一种更高效的改进版本 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 不稳定原因: 由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的。 排序过程: 步骤一:先取一个正整数d1 步骤二:然后取d2 步骤。。。:直至di=1,即所有记录放进一个组中排序为止。 快速排序(Quicksort)冒泡的改进 呃。。。 归并排序*(Merge Sort)--稳定 该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 堆排序(Heapsort) 利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 堆的操作 基数排序(radix sort) --稳定 原理: 排序算法全(Java) 标签:static pre 分组 quic loading item tostring 一般来说 空间 原文地址:https://www.cnblogs.com/smallores/p/smalloresforsort.htmlpackage org.hrose.sort;
import java.util.Arrays;
public class BuddleSort {
public static void main(String[] args) {
int [] array = {54,8,5,45,5,95,15};
BuddleSort(array);
}
public static void BuddleSort(int [] array){
boolean flag =false;
for(int i =0;i
package org.hrose.sort;
import java.util.Arrays;
public class SelectSort {
public static void main(String[] args) {
int [] array ={45,8,8,8,84,846,4,94};
SelectSort(array);
}
public static void SelectSort(int[] array) {
for (int j =0;j
package org.hrose.sort;
import java.util.Arrays;
public class InsertSort {
public static void main(String[] args) {
int[] array = {78, 88, 68, 2, 5, 3};
insertSort(array);
}
public static void insertSort(int[] array) {
for (int i =1;i
package org.hrose.sort;
import java.util.Arrays;
public class ShellSort {
public static void main(String[] args) {
int [] array ={515,78,8,84,96,49,49,8,498};
ShellSort2(array);
}
public static void ShellSort2(int [] array){
for(int gap = array.length/2;gap>0;gap /=2){
for(int i = gap;i
package org.hrose.sort;
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int[] array = {15, 33, 18, 47, 66, 28,18,93,24};
QuickSort(array, 0, array.length - 1);
System.out.println("array" + Arrays.toString(array));
}
public static void QuickSort(int [] array , int left, int right){
int l =left;
int r = right;
int povit = array[(l+r)/2];
while(lr){
while(array[l]povit){
l+=1;
}
while(array[r]>povit){
r-=1;
}
if(l>=r){
break;
}
int temp = array[l];
array[l] = array[r];
array[r] = temp;
if(array[l] ==povit){
r-=1;
}
if(array[r]==povit){
l+=1;
}
}
if(l==r){
l+=1;
r-=1;
}
if(right>l){
QuickSort(array,l,right);
}
if(leftr){
QuickSort(array,left,r);
}
}
}
package org.hrose.sort;
import java.util.Arrays;
public class MergeSort {
public static void main(String[] args) {
int [] array={41,8,4,89,48,8,84,8,6,6,8,48,45,8,4};
int [] temp = new int [array.length];
mergeSort(array,0,array.length-1,temp);
System.out.println(Arrays.toString(array));
}
public static void mergeSort(int [] arry,int left,int right,int []temp){
if(leftright){
int mid=(left+right)/2;
mergeSort(arry,left,mid,temp);
mergeSort(arry,mid+1,right,temp);
merge(arry,left,mid,right,temp);
}
} public static void merge(int [] arry,int left,int mid,int right,int []temp){
int i =left;
int j =mid+1;
int t =0;
while(iright){
if(arry[i]arry[j]){
temp[t]=arry[i];
t+=1;
i+=1;
}else {
temp[t] = arry[j];
j+=1;
t+=1;
}
}
while(imid){
temp[t]=arry[i];
t+=1;
i+=1;
}
while(jright){
temp[t] = arry[j];
j+=1;
t+=1;
}
t=0;
int templeft =left;
while(templeftright){
arry[templeft] = temp[t];
t+=1;
templeft+=1;
}
}
}
package org.hrose.sort;
import java.util.Arrays;
/**
* 代码来源于网络
*/
public class HeapSort {
public static void main(String[] args) {
int [] array={41,8,4,89,48,8,84,8,6,6,8,48,45,8,4};
int[] a = heapSort(array);
System.out.println(Arrays.toString(a));
}
public static int[] heapSort(int[] array) {
//这里元素的索引是从0开始的,所以最后一个非叶子结点array.length/2 - 1
for (int i = array.length / 2 - 1; i >= 0; i--) {
adjustHeap(array, i, array.length); //调整堆
}
// 上述逻辑,建堆结束
// 下面,开始排序逻辑
for (int j = array.length - 1; j > 0; j--) {
// 元素交换,作用是去掉大顶堆
// 把大顶堆的根元素,放到数组的最后;换句话说,就是每一次的堆调整之后,都会有一个元素到达自己的最终位置
swap(array, 0, j);
// 元素交换之后,毫无疑问,最后一个元素无需再考虑排序问题了。
// 接下来我们需要排序的,就是已经去掉了部分元素的堆了,这也是为什么此方法放在循环里的原因
// 而这里,实质上是自上而下,自左向右进行调整的
adjustHeap(array, 0, j);
}
return array;
}
/**
* 整个堆排序最关键的地方
* @param array 待组堆
* @param i 起始结点
* @param length 堆的长度
*/
public static void adjustHeap(int[] array, int i, int length) {
// 先把当前元素取出来,因为当前元素可能要一直移动
int temp = array[i];
for (int k = 2 * i + 1; k //2*i+1为左子树i的左子树(因为i是从0开始的),2*k+1为k的左子树
// 让k先指向子节点中最大的节点
if (k + 1 //如果有右子树,并且右子树大于左子树
k++;
}
//如果发现结点(左右子结点)大于根结点,则进行值的交换
if (array[k] > temp) {
swap(array, i, k);
// 如果子节点更换了,那么,以子节点为根的子树会受到影响,所以,循环对子节点所在的树继续进行判断
i = k;
} else { //不用交换,直接终止循环
break;
}
}
}
/**
* 交换元素
* @param arr
* @param a 元素的下标
* @param b 元素的下标
*/
public static void swap(int[] arr, int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
}
package org.hrose.sort;
import java.util.Arrays;
public class RadixSort {
public static void main(String[] args) {
int [] array = {50,5,8,4,9,2,8,7,66,88,44,93};
radixSort(array);
}
public static void radixSort(int[] array) {
int max = array[0];
for (int i = 0; i ) {
if (max array[i]) {
max = array[i];
}
}
int maxLength = (max + "").length();
int[][] bucket = new int[10][array.length];
int[] bucketElementCount = new int[10];
for (int i =0,n=1;i