算法入門理解
1.以下文章只適合算法入門愛好者,排序算法篇
理解的基礎交換
//實現左右值的交換
int tmp=arr[i]; //tmp作爲臨時變量
arr[i]=arr[i+1]; //右側賦值給左側(左側值被覆蓋)
arr[j+1]=tmp;//將臨時變量的值
將問題F(N)拆分爲F(N-1)+1即F(N)=F(N-1)+1個問題;個人理解就是,一趟排序實現左右側的數據交換,重複此步驟達到排序目的
A:冒泡排序
/**
* 冒泡排序
* 原始定義:
*
* 1、從列表的第一個數字到倒數第二個數字,逐個檢查:若某一位上的數字大於他的下一位,則將它與它的下一位交換。
2、重複1號步驟,直至再也不能交換。
//個人理解:N次排序實現左右數據交換;程序有一個入口,一個出口,入口第一個和第二個比較,
//出口最後兩個元素進行比較
* @param arr
*/
public static void bubbleSort(int [] arr) {
for (int i = 0; i < arr.length-1; i++) { //需要的排序次數
for (int j = 0; j < arr.length-1-i; j++) { //01一趟排序,先寫for循環,爲何要減i,對排序算法的改進,
//因爲每次排序,到最後的數,都爲最小或者最大,排序一次交換次數減少一次,減少i次
//爲什麼還要減1,防止越界異常
if(arr[j]>arr[j+1]) { //02比較左右側,符合條件進行交互
int tmp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=tmp;
}
}
}
}
B快速排序
/**
* 快速排序:它採用了分治的思想:先保證列表的前半部分都小於後半部分,然後分別對前半部分和後半部分排序,這樣整個列表就有序了
* 個人理解:一趟排序將數據分爲兩個部分,遞歸調用自身達到完整排序
*
* @param arr
* @param low
* @param high
*/
public static void quickSort(int[]arr,int low,int high) {
if(low>=high) { //程序的出口
return;
}
int i=low;
int j=high;
int key=arr[low]; //作爲臨時變量tmp和中間值的作用,由於第一次並不知道誰是中間值
while(i<j) { // 01,一趟排序
//以下兩個while循環是爲數據交換準備,循環次數右遞歸控制
while(i<j&&arr[j]>key) { //02交換的條件,02和03的順序不能調換,因爲會產生數據覆蓋的問題,原因考慮 左右數據交換的原理
j--; //高位往下走 ,在c語言中是指針從尾部向中間
}
arr[i]=arr[j]; //當不大於時,將高位的值賦給低位,此時tmp已存儲值不用擔心丟失的問題
while(i<j&&arr[i]<key) {//03交換的條件
i++;
}
arr[j]=arr[i];
}
arr[i]=key; //此步驟相當於將tmp賦值給arr[i];
quickSort(arr,low,i-1); //對比中間值小的進行遞歸調用
quickSort(arr,i+1,high);//對比中間值大的進行遞歸調用
}