Java冒泡,快速,插入,选择排序^_^+二分算法查找
这段时间在学Java,期间学到了一些排序和查找方法。特此写来和大家交流,也方便自己的日后查看与复习。
1.下边是Java的主类:
public class Get
{
public static void main(String[] args)
{ int len=10;
int[] a=new int[len]; for(int i=0;i<len;i++)
{
int t=(int)(Math.random()*10);
a[i]=t;
} //静态初始化数组
//int[] b=new int[]{1,2};
// 动态初始化数组:由下面看出动态初始化就是只指定数组的长度,由系统为数组分配初始值。
int[] b=new int[10]; // int a[]={2,45,34,1,3,6,5,67,867,76};
// int a[]={4,2,45,34,1,3,6,5,67,867,76};
Insert is=new Insert();
is.sort(a);
// Bubble bub=new Bubble();
// bub.bubblesort(a);
Select sl=new Select();
sl.sort(a);
// Quick qc=new Quick();
// qc.sort(a, 0, a.length-1); for(int i=0;i<a.length;i++){
b[i]=a[i];
System.out.print(b[i]+" ");
} BinaryFind bf=new BinaryFind(); /*System.out.println("Hello World!");
Fun f=new Fun(23,"李四");
System.out.println("我的名字叫"+f.name);
System.out.println("我的年龄为"+f.age);*/
}
}
其中,以下代码将定义一个数组,并且将产生一组随机数,存放在数组a[]中:
int len=10;
int[] a=new int[len]; for(int i=0;i<len;i++)
{
int t=(int)(Math.random()*10);
a[i]=t;
}
数组的初始化方式有静态和动态俩种,不能够混合使用,如
int[] b=new int[2]{1,2};将会报一个经典的错误。
2.二分算法查找。
二分算法的主要思想是:递归。一次没找到,将会不停的调用该函数,直到不满足条件或者找到该函数为止。
代码如下:
//二分算法!!!
class BinaryFind
{
public void find(int left,int right,int a[],int val)
{
//找到中间的数midVal
int midIndex=(left+right)/2;
int midVal=a[midIndex]; if(left<=right)
{
//当左边小于右边时执行以下操作:
if(midVal>val)
{
//递归调用
find(left,midIndex-1,a,val);
}else if(midVal<val)
{
find(midIndex+1,right,a,val);
}else
{
System.out.println("已经找到该数,下标为:"+midIndex);
}
}else
{
System.out.println("找不到该数");
}
}
}
3.插入排序
插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)
//插入排序!!!
class Insert
{
public void sort(int a[])
{
for(int i=1;i<a.length;i++)
{
int insertVal=a[i];
//将insertVal与前一个数比较
int index=i-1;
while(index>=0&&insertVal<a[index])
{
//将a[index]向后移动
a[index+1]=a[index];
//让index向前移动
index--;
}
//否则将insertVal插入到适当位置
a[index+1]=insertVal;
}
}
}
谨记如果此判断条件index>=0的等号忘记加,则,数组中的第一个元素将不会参与排序!!!
while(index>=0&&insertVal<a[index])
4.快速排序!!!
//* 快速排序。
//* 思想:选定一个元素作为枢纽元素,将小于该元素的元素放到左边,大于该元素的放到右边。不断重复此过程。
//* 直到最终形成一个有序的列表。
//* 下面的参数low,high就是可以支持一个数组的一个子区间进行排序。
//* 如果是整个数组进行排序,则low=0,high=数组.length-1。
//* @param data:要排序的数组。
//* @param low:排序的起始位置
//* @param high:排序的结束位置。
class Quick
{
public void sort(int a[], int low, int high){
int i=low;
int j=high;
int key=a[low]; if (low < high) {
// 枢纽元素
System.out.println("枢纽元素是:" + key + ",low:" + low + ",high:" + high); while(i<j)
{
while(i<j&&key<=a[j])
{
j--;
}
a[i]=a[j];
// int temp=a[j];这三行可以与前面一行互换,实现的功能相同。
// a[j]=a[i];
// a[i]=temp;</span>
while(i<j&&key>=a[i])
{
i++;
}
a[j]=a[i];
//下面标红三行与上面一行功能相同
// int temp1=a[j];
// a[j]=a[i];
// a[i]=temp1;</span> a[i]=key;
}
sort(a,low,i-1);
sort(a,i+1,high);
}
}
}
快速排序值得注意的地方为,在主函数中调用方法要注意数组越界的问题。
即 Quick qc=new Quick(); qc.sort(a, 0, a.length-1);在传递实参的时候是a.length-1而不是a.length
5.选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
//选择排序!!!
class Select
{ int temp;
public void sort(int a[]){
for(int i=0;i<a.length-1;i++){ for(intj=i+1;j<a.length;j++){ 将俩个元素进行比较
if(a[i]>a[j]){
temp=a[j];
a[j]=a[i];
a[i]=temp;
}
}
}
}
}
6.冒泡排序
冒泡排序重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
//冒泡排序!!!
class Bubble
{
int temp;
public void bubblesort(int a[]){
for(int i=0;i<a.length-1;i++){ for(int j=0;j<a.length-1-i;j++){
//a.length-1-i是因为最后的i个元素已经有序。 if (a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
} }
}
}
7.二维数组
这是自己先前用来练手的二维数组的使用方法,一起来看看吧。
//将一个矩阵倒置输出!!!
class Array
{
//int num[][];
int num[][]={
{1,2,3},
{4,5,6},
{7,8,9}
};
public void get(){
System.out.println("原数组为:");
for(int i=0;i<=2;i++){
for(int j=0;j<=2;j++){
System.out.print(num[i][j]+"\t");
}
System.out.println("\n");
}
System.out.println("倒置后的数组为:");
for(int i=0;i<=2;i++){
for(int j=0;j<=2;j++){
System.out.print(num[j][i]+"\t");
}
System.out.println("\n");
} } }
8.99乘法表
先前学习的俩层循环,99乘法表 ^_^
//输出99乘法表!!!
class Table
{
public static void get(){
for(int i=1;i<=9;i++){
for(int j=1;j<=i;j++){
System.out.print(i+"*"+j+"="+i*j+"\t"); }
System.out.print("\n");
}
}
}
Java冒泡,快速,插入,选择排序^_^+二分算法查找的更多相关文章
- 排序系列 之 简单选择排序及其改进算法 —— Java实现
简单选择排序算法: 基本思想: 在待排序数据中,选出最小的一个数与第一个位置的数交换:然后在剩下的数中选出最小的数与第二个数交换:依次类推,直至循环到只剩下两个数进行比较为止. 实例: 0.初始状态 ...
- Java版冒泡排序和选择排序
一.理解说明 1.理解和记忆 冒泡排序:依次定位数组元素,每次只和相邻的且符合条件的元素交换位置. 选择排序:依次在数组的每个位置,通过逐个对比选择出最大或最小的元素. 2.知识点说明 (1)数组是引 ...
- Java基础(46):选择排序的Java封装(完整可运行)
1 package lsg.ap.select; import java.util.Random; public class SelectSort { //选择排序 /** *@author: 梁山广 ...
- java实现冒泡排序,选择排序,插入排序,快速排序(简洁版)及性能测试
1.冒泡排序是排序里面最简单的了,但性能也最差,数量小的时候还可以,数量一多,是非常慢的. 它的时间复杂度是O(n*n),空间复杂度是O(1) 代码如下,很好理解. public void bubbl ...
- java:冒泡排序、选择排序、插入排序实现
整数排序 给一组整数,按照升序排序,使用选择排序,冒泡排序,插入排序或者任何 O(n2) 的排序算法. 样例 样例 1: 输入: [3, 2, 1, 4, 5] 输出: [1, 2, 3, 4, 5] ...
- Java实现冒泡排序,选择排序,插入排序
冒泡排序: 思想: 冒泡排序重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说排序完成 特点:比较稳定,排序数较小是 ...
- Java冒泡排序与直接选择排序代码随笔
冒泡排序:延申的有很多种,有的是先确定最大值放到后面,有的是先确定最小值放到前边,还有就是反过来,先确定最小值的位置,但是本质都是:不断两两比较,交换位置...第一趟确定一个最大(最小)值放到前边(后 ...
- java 冒泡排序法、选择排序
1.冒泡排序 /* * 冒泡排序 * 外层控制循环多少趟,内层控制每一趟的循环次数 */ public class Test08 { public static void main(String[] ...
- 带精英策略的快速非支配排序遗传算法 NSGA-II 算法
NSGAII(带精英策略的非支配排序的遗传算法),是基于遗传算法的多目标优化算法,是基于pareto最优解讨论的多目标优化,下面介绍pareto(帕累托)最优解的相关概念. Paerot支配关系 Pa ...
随机推荐
- jquery源码分析(四)——回调对象 Callbacks
借用百度百科来说明下回调函数: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该 ...
- 【codeforces 767C】Garland
[题目链接]:http://codeforces.com/contest/767/problem/C [题意] 一棵树; 树上的每个节点都有一个权值; 让你把一棵树切掉两条边; 然后把这棵树分成了3个 ...
- KD树学习小结
几个月后的UPD: 学习完下面之后,实战中的总结: 0.比赛中正解就是kdtree的题目很少很少 1.几类优先考虑kdtree的题目: k(维度) >= 3 的题目 二维平面上涉及区间标记的题目 ...
- java枚举怎么用的
package com.pingan.property.icore.pap.common.constants; /** * */public enum UMAuthStatusEnum impleme ...
- 基数排序之多keyword排序运用队列
源码例如以下: #include <stdlib.h> #include <stdio.h> typedef struct QUEUEnode* link; struct QU ...
- matlab中怎样加入凝视
1)方法一 选中你要加凝视的内容,然后选择工具菜单"text|comment"就能够了,假设要把凝视变为语句,相同选中要转变的语句,然后用鼠标选择"text|uncomm ...
- wpf 样式的调用
这个针对异地调用: 1.在主程序的项目中新建一个Skins的目录.然后再目录里新建一个BlackSkin.xaml的字典资源: <ResourceDictionary xmlns="h ...
- Unreal Engine 4 Camera Lag(摄影机延迟)
以官方的Third Person Template为样例,Character蓝图中的USpringArmComponent就实现了摄影机和场景碰撞和交互等大部分的功能了. 要实现摄影机延时,仅仅须要改 ...
- NoSQL数据库:Redis内存使用优化与存储
Redis常用数据类型 Redis最为常用的数据类型主要有以下五种: ●String ●Hash ●List ●Set ●Sorted set 在具体描述这几种数据类型之前,我们先通过一张图了解下Re ...
- WCF学习笔记——契约不能少了set
我定义的WCF契约里,有一个类,里面的属性,有一个因为只读,所以只写了个get.结果客户端就报错. [DataContract] public class UserItem { public User ...