package java2019;
import java.util.ArrayList;
//最小的K个数(附加8大排序算法)
public class Demo28 {
//1.冒泡排序
public static ArrayList<Integer> GetLeastNumbers(int [] input,int k){
ArrayList<Integer> list = new ArrayList<Integer>();
if(k>input.length)
return list;
for(int i=0;i<k;i++){
for(int j=0;j<input.length-1-i;j++){
if(input[j]<input[j+1]){
int temp = input[j];
input[j] = input[j+1];
input[j+1] = temp;
}
}
list.add(input[input.length-1-i]);
}
return list;
}
//2.选择排序
public static ArrayList<Integer> GetLeastNumber1(int [] input,int k){
ArrayList<Integer> list = new ArrayList<Integer>();
if(k>input.length)
return list;
for(int i =0;i<k;i++){
for(int j=i+1;j<input.length;j++){ //选择排序
if(input[i]>input[j]){
int temp = input[i];
input[i]=input[j];
input[j]=temp;
}
}
list.add(input[i]);
}
return list;
}
//3.堆排序
public ArrayList<Integer> GetLeastNumber2(int [] input,int k){
int i;
ArrayList<Integer> list = new ArrayList<Integer>();
for(i=input.length/2-1;i>=0;i--){
adjustHeap(input,i,input.length);
}
//以上步骤建堆结束
//以下开始排序逻辑
for(i=input.length-1;i>0;i--){
swap(input,0,i);
adjustHeap(input,0,i);
}
//以上排序结束
for(i=0;i<k;i++){
list.add(input[i]);
}
return list;
}
public void adjustHeap(int input[],int p,int N){
//将N个元素的数组中以input[p]为根的子堆调整为最大堆
int parent,child;
int temp = input[p]; //取出根节点存放的值
for(parent=p;(parent*2+1)<N;parent=child){
child = 2*parent+1;
if((child!=N-1)&&(input[child]<input[child+1])){//若child==N-1 那么左节点就是最大值
child++; //child指向左右接点较大者
}
if(temp>=input[child]) break;
else //下滤
input[parent] = input[child];
}
input[parent]=temp;
}
public void swap(int input[] ,int i,int j){
int temp = input[i];
input[i] = input[j];
input[j] = temp;
}
//4.快速排序
public void quickSort(int [] input,int low,int high){
//递归出口
if(low>high)
return;
int i = low;
int j = high;
int key=input[low];
//完成一趟快排
while(i<j){
//从右往左找到第一个小于Key的数
while(i<j&&input[j]>=key)
j--;
//从左往右找到第一个大于key的数(必须要加=)
while(i<j&&input[i]<=key)
i++;
//交换
if(i<j)
swap(input,i,j);
}
//调整key的位置,交换位置
input[low]=input[i];
input[i]=key;
//递归
quickSort(input,low,i-1);
quickSort(input,i+1,high);
}
//5.插入排序(基本有序,规模较小)
public void insertSort(int [] array){
int pos,temp;
for(int i=1;i<array.length;i++){
pos=i;
while(pos!=0&&array[pos]<array[pos-1]){
temp = array[pos];
array[pos] = array[pos-1];
array[pos-1] = temp;
pos--;
}
}
}
//6.shell排序
public void shellSort(int [] array){
int N = array.length;
//进行分组,最开始时 的增量(gap)为数组长度的一半
for(int gap = N/2;gap>0;gap/=2){
//对各个分组进行插入排序
for(int i=gap;i<N;i++){
//将array[i]插入到所在分组的正确位置上
insertI(array,gap,i);
}
}
}
//将array[i]插入到所在分组的正确位置上
public void insertI(int [] array,int gap,int i){
int inserted = array[i];
int j;
//插入的时候按组进行插入(组内元素两两相隔gap)
for(j=i-gap;j>0&&inserted<array[j];j-=gap){
array[j+gap]=array[j];
}
array[j+gap]=inserted;
}
}
28.八大排序算法
最新推荐文章于 2023-10-13 14:39:20 发布