冒泡排序
原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换
这样一趟过去后,最大或最小的数字被交换到了最后一位
然后再从头开始进行两两比较交换,直到倒数第二位时结束
依此类推,直到排序结束
代码如下:
public int[] bubbleSort(){
int a[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};
int temp=0;
for(int i=0;i<a.length-1;i++){
for(int j=0;j<a.length-1-i;j++){
if(a[j]>a[j+1]){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
return a;
}
排序算法
####插入排序
public static void main(String[] args) {
int[] r = random();
System.out.println(Arrays.toString(r));
System.out.println("==========");
sort(r);
System.out.println(Arrays.toString(r));
}
static int[] random(){
//随机长度[5,11)
//随机长度5+[0,6)
int len = 5+new Random().nextInt(6);
int[] r = new int[len];
for(int i=0;i<r.length;i++){
//数组内放入100内的随机整数
r[i] = new Random().nextInt(100);
}
return r;
}
static void sort(int[] r){
//第一个值默认为有序数字,从第二个值开始
for(int i=1;i<r.length;i++){
//i的循环范围是i-1到0递减,拽着i往前走
for(int j=i-1;j>=0;j--){
//相邻的j和j+1比较,如果j+1位置处大,两个位置交换
if(r[j]>r[j+1]){
int temp = r[j];
r[j] = r[j+1];
r[j+1] =temp;
}else{//如果j位置<j+1位置的值,跳出
break;
}
}
}
System.out.println(Arrays.toString(r));
}
####冒泡排序
static void sort(int[] r){
/*
*1、循环i从0到r.length递增
* 2、循环j从r.length到>i递减
* 3、如果r[j-1]>r[j]交换
* 4、交换位置
*
*/
for(int i=0;i<r.length;i++){
//j循环把小值向前推,推到i位置
for(int j=r.length-1;j>i;j--){
if(r[j-1]>r[j]){
int temp = r[j-1];
r[j-1] = r[j];
r[j] = temp;
}
}
System.out.println(Arrays.toString(r));
}
}
改进版冒泡排序
static void sort(int[] r){
/*
*1、循环i从0到r.length递增
* 2、循环j从r.length到>i递减
* 3、如果r[j-1]>r[j]交换
* 4、交换位置
*
*/
for(int i=0;i<r.length;i++){
//j循环把小值向前推,推到i位置
boolean flag = false;//没有交换
for(int j=r.length-1;j>i;j--){
if(r[j-1]>r[j]){
int temp = r[j-1];
r[j-1] = r[j];
r[j] = temp;
flag = true;//有交换
}
}
if(!flag){//j递减过程中没有交换任何数据,说明已经排好了
break;
}
System.out.println(Arrays.toString(r));
}
}
二分法查找(折半查找)
有序的数组中查找值所在的下标位置,适合数据量大,且有序的数组
xml代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="随机生成有序数组"
android:onClick="doClick"/>
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<EditText
android:id="@+id/editText1"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="二分法查找"
android:onClick="doClick"/>
<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
java代码
public class MainActivity extends AppCompatActivity {
Button button1;
TextView textView1;
TextView textView2;
EditText editText1;
int[] a;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button1 = (Button) findViewById(R.id.button1);
textView1 = (TextView) findViewById(R.id.textView1);
textView2 = (TextView) findViewById(R.id.textView2);
editText1 = (EditText) findViewById(R.id.editText1);
}
public void doClick(View v) {
switch (v.getId()) {
case R.id.button1:
f1();
break;
case R.id.button2:
f2();
break;
}
}
private void f1() {
/**
* 1、随机生成[5,11)的整数赋值给len
* 2、新建数组int[]赋值给成员变量a,长度为len
* 3、遍历数组,在每个位置放入100内随机整数
* 4、调用Arrays.sort()方法进行排序
*/
int len = 5 + new Random().nextInt(6);
a = new int[len];
for (int i = 0; i < a.length; i++) {
a[i] = new Random().nextInt(100);
}
Arrays.sort(a);
textView1.setText(Arrays.toString(a));
}
private void f2() {
int value = Integer.parseInt(editText1.getText().toString());
int index = binarySearch(a, value);
textView2.setText(index + "");
}
private int binarySearch(int[] a, int t) {
/**
* t=59
* mid
* [17,19,27,48,58,59,67,89]
* low
* high
* 1、定义下标
* low = 0
* high = a.length-1
* mid
* 2、当low<=high
* 3、mid = (low+high)/2
* 4、如果a[mid]<t
* 5、low移动到mid+1位置
* 6、如果a[mid]>t
* 7、high移动到mid-1位置
* 8、否则
* 9、直接返回mid的值
* 10、找不到,返回无意义的值
*/
int low = 0;
int high = a.length - 1;
int mid;
while (low <= high) {
mid = (low + high) / 2;
if (a[mid] < t) {
low = mid + 1;
} else if (a[mid] > t) {
high = mid - 1;
} else {
return mid;
}
}
return -1;
}
}
递归练习
求阶乘
public class HelloWorld {
public static void main(String[] args) {
System.out.println("输入求阶乘");
int n = new Scanner(System.in).nextInt();
long r = f(n);
System.out.println(r);
}
private static long f(int n) {
// TODO Auto-generated method stub
if(n == 0){
return 1;
}
return n*f(n-1);
}
}
求斐波那契数(1)
public static void main(String[] args) {
/*
* 斐波那契数列
* 1 1 2 3 5 8 13 21 34...
* 求第n个及前两个数之和
* (n-2)+(n-1)
*
* */
System.out.println("求第几个斐波那契数");
int n = new Scanner(System.in).nextInt();
long r = f(n);
System.out.println(r);
}
private static long f(int n) {
// TODO Auto-generated method stub
if(n == 1 || n == 2){
return 1;
}
return f(n-2)+f(n-1);
}
求斐波那契数(2)
public static void main(String[] args) {
/*
* 斐波那契数列
* 1 1 2 3 5 8 13 21 34...
* 求第n个及前两个数之和
* (n-2)+(n-1)
*
* */
System.out.println("求第几个斐波那契数");
int n = new Scanner(System.in).nextInt();
long r = f(n);
System.out.println(r);
}
private static long g(int n) {
// TODO Auto-generated method stub
return 0;
}
private static long f(int n) {
/*
* 1 1 2 3
* a b
*
* 1 1 2 3
* a b
* 重新赋值
* b=a+b
* a=b-1
* */
long a = 1;
long b = 1;
for(int i=3;i<=n;i++){
b=a+b;
a=b-a;
}
return b;
}