读《程序员编程艺术》之自造Java版本-----插入排序实现最小K问题
来源:互联网 发布:域名备案注销 编辑:程序博客网 时间:2024/06/03 18:15
本人最近想提高一下自己的编程能力,因此对《程序员编程艺术》进行拜读,网址为http://blog.csdn.net/v_JULY_v/article/details/6460494
深深的为作者的无私所震撼,因此想把自己的个人体会和程序贴出来,一来希望对他人有所帮助,二来加深自己的理解。不足指出多指正!
针对第三章求最小K问题,根据作者的思想,对其在Java上进行了实现:
方法一:采用直接插入排序算法,只需求出其前K个最小的值即可。在此没有应用作者的思路,二是对其前K个值全部排序,时间复杂度nlogn,但是在规模上减小了。
package minK;
import java.util.Random;
import java.util.Scanner;
/*
* 查找一组数据中最小的K个数
* 可以使用快速排序的方式对数据全部排序
* 本文要求并未全部排序,只需查找其中K个最小的值即可,故采用插入排序的方式,对前K个数据进行排序,而后比较
* 2015年4月8日 16:17:49
*
*/
public class InsertSelect {
//int numb[]={11,8,10,6,92,2,7,3,10,8,4,5,9,1,40};
int numb[]=new int[100];
int k;
//构造100个随机数
public void Random() {
int max=100;
Random random=new java.util.Random();
for (int i = 0; i < numb.length; i++) {
numb[i]=random.nextInt(max);
}
}
//输入K的值
public void Getk() {
Scanner in=new Scanner(System.in);
System.out.println("请输入K的值");
k=in.nextInt();
}
//通过插入排序实现
public void Insert( ) {
for (int i = 0; i < k; i++) {
if(numb[i+1]<numb[i]){
for (int j = i; j >=0; j--) {
if(numb[i+1]>numb[j]){//寻找比欲插入的数小的数,向后移动,插入数据
int middd=numb[i+1];
for(int t=i+1;t>=j+1;t--){
numb[t]=numb[t-1];
}
numb[j+1]=middd;
break;
}
if(j==0){//当插入数据最小时,搜寻到开头位置,进行移动,赋值
int midd=numb[i+1];
int f=i;
while(f>=0){
numb[f+1]=numb[f];
f--;}
numb[0]=midd;
break;
}
}
}
}
//对K之后的数据进行比对,有小值时,移动替换
for (int i = k; i < numb.length; i++) {
if (numb[i]<numb[k-1]) {
for(int j=k-1;j>=0;j--){
if (numb[j]<numb[i]) {
int mid3=numb[i];
for(int s=k;s>j+1;s--){
numb[s]=numb[s-1];
}
numb[j+1]=mid3;
break;
}
else if (j==0) {
int mid4=numb[i];
for(int s=k;s>0;s--){
numb[s]=numb[s-1];
}
numb[0]=mid4;
break;
}
}
}
}
}
//为方便显示,做两个输出函数
public void Out() {
for (int i = 0; i < numb.length; i++) {
if(i%10==0){
System.out.println();
}
System.out.print(numb[i]);
System.out.print(" ");
}
System.out.println();
}
public void outall() {
System.out.println("最终结果为:");
for (int i = 0; i < k; i++) {
System.out.print(numb[i]);
System.out.print(" ");
}
}
public static void main(String[] args) {
InsertSelect abc=new InsertSelect();
abc.Getk();
abc.Random();
abc.Out();
abc.Insert();
abc.outall();
}
}
- 读《程序员编程艺术》之自造Java版本-----插入排序实现最小K问题
- 读《程序员编程艺术》之自造Java版本----最大堆排序实现最小K问题
- 【July程序员编程艺术】之最小的k个数问题
- 读《程序员编程艺术》之自造Java版本-----字符串左移
- 程序员编程艺术:Top K算法问题的实现
- 程序员编程艺术:第三章、寻找最小的k个数
- 程序员编程艺术:第三章、寻找最小的k个数
- 程序员编程艺术:第三章、寻找最小的k个数
- 程序员编程艺术:第三章、寻找最小的k个数
- 程序员编程艺术:第三章、寻找最小的k个数
- 程序员编程艺术:第三章、寻找最小的k个数
- 程序员编程艺术3:寻找最小的k个数
- 【程序员编程艺术】第三章:寻找最小的k个数
- 程序员编程艺术:第三章、寻找最小的k个数
- 编程艺术之数组2.1 求最小的k个数
- 程序员编程艺术:第三章续、Top K算法问题的实现
- 程序员编程艺术:第三章续、Top K算法问题的实现
- 程序员编程艺术:第三章续、Top K算法问题的实现
- 数据库的查询,关于时间的情况
- Repeater中绑定的LinkButton跳转页面及传递参数
- ListView性能优化
- Python之玩转Jython系列(一)
- 静态方法与实例方法共享设计-jquery学习笔记
- 读《程序员编程艺术》之自造Java版本-----插入排序实现最小K问题
- leetcode || 75、Sort Colors
- 看数据结构写代码(37) 图的十字链表的表示与实现
- IOS 多线程原理
- TRANCE宏的利用
- 构建源码树----Linux内核剖析(三)
- 两种快速排序算法性能的比较
- WCF学习
- 网络编程socket之bind、Listen 及 accept .