java基本算法冒泡,插入,選擇,歸并

最近閑來沒事,回顧了一下java的基本算法,給一些入門java不怎么理解算法的做一個很好的總結(jié),理解精髓,不多說了,關(guān)鍵看代碼,掌握算法思想才能做到靈活變通,算法是死的但是思想是活的,代碼注釋很清晰。

package eat.arvin.com.mychart.bean;

import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;

import android.util.Log;

import android.view.View;

import android.widget.TextView;

import java.util.LinkedList;

public class MainActivityextends AppCompatActivity {

private TextViewtxt_first,txt_last;

//打印集合

? ? private Stringnum_px;

//找出集合的最大值

? ? private int max;

//找出集合的最大值的位置

? ? private int position;

//插入的數(shù)據(jù)

? ? private int cr_num[] = {48,21,560};

private LinkedListlist=new LinkedList<>();

@Override

? ? protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

txt_first = (TextView) findViewById(R.id.txt_first);

txt_last = (TextView) findViewById(R.id.txt_last);

listAdd();

for (int i =0; i

if (num_px ==null) {

num_px =list.get(i) +",";

}else {

num_px =num_px +list.get(i) +",";

}

}

txt_first.setText("排序前" +num_px);

}

private void listAdd(){

list.clear();

list.add(1);

list.add(23);

list.add(12);

list.add(32);

list.add(431);

list.add(2);

list.add(25);

list.add(45);

list.add(46);

list.add(31);

list.add(27);

list.add(68);

}

public void onclick(View view) {

switch (view.getId()) {

case R.id.bt_mp:

sorting_mp();

break;

case R.id.bt_cr:

sorting_cr();

break;

case R.id.bt_xz:

sorting_xz();

break;

case R.id.bt_gb:

sorting_gb();

break;

}

}

/**

* 冒泡排序基本算法

*/

? ? private void sorting_mp() {

listAdd();

//循環(huán)list.size()次找出每次循環(huán)的集合最大值

? ? ? ? for (int i =0; i

//每一次循環(huán)找出該集合的最大值互換位置向后排列(list.size()-i-1:已排列好的集合不需要重新排列)

? ? ? ? ? ? for (int j =0; j

if (list.get(j) >list.get(j+1)) {

max =list.get(j);

list.set(j,list.get(j+1));

list.set(j +1,max);

}

}

}

num_px =null;

//打印排列后的集合

? ? ? ? for (int i =0; i

if (num_px ==null) {

num_px =list.get(i) +",";

}else {

num_px =num_px +list.get(i) +",";

}

}

txt_first.setText("排序后" +num_px);

}

/**

* 插入排序基本算法(當(dāng)列表的數(shù)據(jù)是有序的,此時插入數(shù)據(jù)進(jìn)行排序)

*/

? ? private void sorting_cr() {

sorting_mp();

//循環(huán)需要插入的數(shù)組

? ? ? ? for (int i =0; i

//遍歷集合從最后開始比較,

? ? ? ? ? ? for (int j =list.size()-1; j >=0; j--) {

//如果插入的數(shù)據(jù)沒有比當(dāng)前集合中的數(shù)字大則將當(dāng)前位置向后移,

? ? ? ? ? ? ? ? if (cr_num[i]

if(j==list.size()-1){

//這里比較如果是最后一位則采用添加

? ? ? ? ? ? ? ? ? ? ? ? list.addLast(list.get(j));

}else {

list.set(j+1,list.get(j));

}

}else {

if(j==list.size()-1){

//這里比較如果是最后一位則采用添加

? ? ? ? ? ? ? ? ? ? ? ? list.addLast(cr_num[i]);

}else {

// 將當(dāng)前位置賦值插入的數(shù)據(jù)(這里賦值的當(dāng)前位置是比較后的位置因此要后推一位)

? ? ? ? ? ? ? ? ? ? ? ? list.set(j+1,cr_num[i]);

}

break;

}

}

}

num_px =null;

//打印排列后的集合

? ? ? ? for (int i =0; i

if (num_px ==null) {

num_px =list.get(i) +",";

}else {

num_px =num_px +list.get(i) +",";

}

}

txt_last.setText("排序后" +num_px);

}

/**

* 選擇排序基本算法

* */

? ? private void sorting_xz(){

sorting_mp();

//循環(huán)list.size()次找出每次循環(huán)的集合最大值

? ? ? ? for (int i =0; i

//每一次循環(huán)找出該集合的最大值并標(biāo)記該位置(list.size()-i-1:已排列好的集合不需要重新排列)

? ? ? ? ? ? for (int j =0; j

if (list.get(j) >list.get(j+1)) {

position = j;

}

}

//將上一次的集合最大值排列在最后

? ? ? ? ? ? max=list.get(position);

list.set(position,list.get(list.size()-1));

list.set(list.size()-1,max);

}

num_px =null;

//打印排列后的集合

? ? ? ? for (int i =0; i

if (num_px ==null) {

num_px =list.get(i) +",";

}else {

num_px =num_px +list.get(i) +",";

}

}

txt_first.setText("排序后" +num_px);

}

/**

* 歸并排序基本算法

* */

? ? int date[]={23,1,4,22,56,78,34,46};

private void sorting_gb(){

sort(date,0,date.length-1);

}

public void sort(int[] data,int left,int right) {

if (left >= right)

return;

// 找出中間索引

? ? ? ? int center = (left + right) /2;

// 對左邊數(shù)組進(jìn)行遞歸

? ? ? ? sort(data, left, center);

// 對右邊數(shù)組進(jìn)行遞歸

? ? ? ? sort(data, center +1, right);

// 合并

? ? ? ? merge(data, left, center, right);

num_px =null;

//打印排列后的集合

? ? ? ? for (int i =0; i < data.length; i++) {

if (num_px ==null) {

num_px = data[i] +",";

}else {

num_px =num_px + data[i] +",";

}

}

Log.w("歸并排序",num_px);

}

/**

* 將兩個數(shù)組進(jìn)行歸并,歸并前面2個數(shù)組已有序,歸并后依然有序

*

? ? * @param data

? ? *? ? ? ? ? ? 數(shù)組對象

? ? * @param left

? ? *? ? ? ? ? ? 左數(shù)組的第一個元素的索引

? ? * @param center

? ? *? ? ? ? ? ? 左數(shù)組的最后一個元素的索引,center+1是右數(shù)組第一個元素的索引

? ? * @param right

? ? *? ? ? ? ? ? 右數(shù)組最后一個元素的索引

*/

? ? public void merge(int[] data,int left,int center,int right) {

// 臨時數(shù)組

? ? ? ? int[] tmpArr =new int[data.length];

// 右數(shù)組第一個元素索引

? ? ? ? int mid = center +1;

// third 記錄臨時數(shù)組的索引

? ? ? ? int third = left;

// 緩存左數(shù)組第一個元素的索引

? ? ? ? int tmp = left;

while (left <= center && mid <= right) {

// 從兩個數(shù)組中取出最小的放入臨時數(shù)組

? ? ? ? ? ? if (data[left] <= data[mid]) {

tmpArr[third++] = data[left++];

}else {

tmpArr[third++] = data[mid++];

}

}

// 剩余部分依次放入臨時數(shù)組(實際上兩個while只會執(zhí)行其中一個)

? ? ? ? while (mid <= right) {

tmpArr[third++] = data[mid++];

}

while (left <= center) {

tmpArr[third++] = data[left++];

}

// 將臨時數(shù)組中的內(nèi)容拷貝回原數(shù)組中

// (原left-right范圍的內(nèi)容被復(fù)制回原數(shù)組)

? ? ? ? while (tmp <= right) {

data[tmp] = tmpArr[tmp++];

}

}

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,754評論 18 399
  • 一、 1、請用Java寫一個冒泡排序方法 【參考答案】 public static void Bubble(int...
    獨云閱讀 1,411評論 0 6
  • 入夜之后,寬窄巷子人潮如流,想愜意的獨自走一走那是不可能的了,過于的、雷同的商業(yè)化,使你感覺不出什么,感受到的只有...
    26c0acdcc586閱讀 289評論 2 8
  • 財源廣進(jìn)鉆石繡 財源廣進(jìn)滿鉆十字繡,是由風(fēng)水大師精心設(shè)計,豐富的寓意幾乎解決了所有風(fēng)水問題,魔方鉆顏色飽滿細(xì)膩,過...
    藝海云閣閱讀 1,439評論 0 0
  • 讀萬卷書行萬里路,讀萬卷書不如行萬里路,行萬里路不如閱人無數(shù),閱人無數(shù)不如名師指路,名師指路不如自己去悟。我悟出來...
    綠茵少年閱讀 473評論 0 2