最近閑來沒事,回顧了一下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++];
}
}
}