Java编程基于快速排序的三个算法题实例代码编程基于快速排序的三个算法题实例代码
主要介绍了Java编程基于快速排序的三个算法题实例代码,小编觉得还是挺不错的,具有一定借鉴价值,需要
的朋友可以参考下
快速排序原理简介快速排序原理简介
快速排序是我们之前学习的冒泡排序的升级,他们都属于交换类排序,都是采用不断的比较和移动来实现排序的。快速排序是
一种非常高效的排序算法,它的实现,增大了记录的比较和移动的距离,将关键字较大的记录从前面直接移动到后面,关键字
较小的记录从后面直接移动到前面,从而减少了总的比较次数和移动次数。同时采用“分而治之”的思想,把大的拆分为小的,
小的拆分为更小的,其原理如下:对于给定的一组记录,选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟
扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用
同样的方法递归地排序划分的两部分,直到序列中的所有记录均有序为止。
一,最小的一,最小的k个数个数
输入n个数,找出其中最小的k个数,例如输入4,5,1,6,2,7,3,8,个数字,则最小的数字是1,2,3,4
基于O(n)的算法,可以用基于Partion函数解决这个问题,如果基于数组的第k个数字来调整,使得比第k个数字小的所有数字
都位于数组的左边,比第k个数组大的所有数字都位于数组的右边,这样调整之后数组左边的k个数字就是最小的k个数字,不
一定有序
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextint();
int k=in.nextint();
int[] num=new int[n];
int[] out=new int[k];
for (int i=0;i<n;i++){
num[i]=in.nextint();
}
Boolean b=GetMinK(n,num,k,out);
if(b){
for (int i=0;i<k;i++){
System.out.print(out[i]+" ");
}
}
}
public static Boolean GetMinK(int uiInputNum, int[] pInputArray, int uiK, int[] pOutputArray){
if(pInputArray==null||pOutputArray==null||uiK>uiInputNum||uiInputNum<=0||uiK<=0){
return false;
}
int start=0;
int end=uiInputNum-1;
int index=partition(pInputArray,start,end);
while(index!=uiK-1){
if(index>uiK-1){
//index在k-1的右边
end=index-1;
index=partition(pInputArray,start,end);
} else{
start=index+1;
index=partition(pInputArray,start,end);
}
}
for (int i=0;i<uiK;i++){
pOutputArray[i]=pInputArray[i];
}
return true;
}
//partion分区函数,返回数组a的首元素快排的索引值index
public static int partition(int[] a,int start,int end){
int privot=a[start];
int i=start;
int j=end;
while(i<j){
while(i<j&&privot<=a[j]){
j--;
}
swap(a,i,j);
while(i<j&&privot>=a[i]){
i++;
}
swap(a,i,j);
评论0
最新资源