1. 程式人生 > 實用技巧 >ThreadX應用開發筆記之一:移植ThreadX到STM32平臺

ThreadX應用開發筆記之一:移植ThreadX到STM32平臺

陣列:

陣列Array即一組資料模式用來記錄多個型別相同的資料

特點:

  1.陣列長度不可變

  2.陣列可儲存基本型別,也可以儲存引用型別

  3.陣列在記憶體中是連續儲存資料的

  4.陣列通過索引(下標)對連續資料進行訪問的

如何實現陣列元素的刪除:

  1.判斷待刪除的元素是否在陣列中

  2.將刪除元素的最後一位依次向前移動

  3.最後位元素不進行列印

如何實現陣列元素的新增(陣列值必須連續遞增):

  1.查詢要新增元素在陣列中的位置

  2.該位置為第一次比新增值大的元素索引

  3.從陣列最後位開始向前依次交換元素

  4.將新增值寫入查詢位置

如何查詢最大值:

  1.設定一個元素為最大值

  2.依次將每個元素與最大值進行比較

  3.比最大值更大的元素將成為新的最大值

常用的排序演算法:

  1.氣泡排序法(最大值在最後)

    1)將相鄰元素依次比較,如果後一個較小則交換位置

    2)通過一輪比較(陣列中每個元素都比較依次),陣列中的最大值將產生在最後

    3)已經產生的最大值不再參與比較,開啟下一輪比較

    4)每輪都產生一個最大值

    5)直至只有一個元素時結束排序

  2.選擇排序法

    1)將第一個數作為最小值依次和後面的每個元素進行比較

    2)如果後面的元素比第一個元素小,則交換兩數

    3)一輪比較後,第一個元素即為最小值

    4)第二輪比較從第二個元素開始,依次和後面的每個元素分別比較,比較過後產生第二個最小值在第二位

  3.快速排序法(二分排序法):

    1)將第一個數定位基準數:1)j負責從右往左查詢比基準數(第一個數)小的數

                 2)i負責從左往右查詢比基準數(第一個數)大的數

    2)若i和j沒有碰頭,且都找到了,則將兩數array[ i ]和array[ j ] 交換,這樣左邊的就是小的,右邊的就是大的

    3)知道 i 和 j 相遇,則此處即為基準數應該在的地方,將array[ left ]與array[ i ]交換

    4)第一輪結束後,則在基準數位置即i與j相遇處將陣列一分為二

    5)重新呼叫遞迴該方法,左右邊界重新賦值

建立陣列(三種方式):

/************方式一*********/
String[] array=new String[5];
System.out.println(array[0]);
int[] Array=new int[5];
System.out.println(Array[1]);


/************方式二*********/
String[] array1=new String[]{"tom","jack","jerry"};
//訪問第二個數值
System.out.println(array1[1]);
//訪問第一個數值
System.out.println(array1[0]);
//訪問倒數第二個數值
System.out.println(array1[array1.length-1]);

/************方式三*********/ String[] array2={"tom","jack","jerry"}; for(int i=0;i<array2.length;i++){ System.out.println(array2[i]); }

檢索資料是否在陣列中(沒有找到返回-1,找到返回下標):

 public int find(String[] array,String value){
        //預設返回-1
        int index=-1;
        //遍歷陣列
        for(int i=0;i<array.length;i++){
            //如果有相同的數值
            if(array[i].equals(value)){
                //返回下標
                index=i;
                break;
            }
        }
        return index;
    }

刪除陣列中元素的方法:

  方法一:將元素賦值為null:列印時判斷是否為null,不為null則打印出來

public void delete(String[] array,String value){
        //查詢是否存在的方法,如果存在返回下標,如果不存在返回-1
        int index=find(array,value);
        //判斷值是否在陣列中存在
        if(index!=-1){
            //如果存在則賦值為null
            array[index]=null;
        }
    }    

  方法二:向前賦值法:列印時不列印最後一位

 public void delete2(String[] array,String value){
        //陣列中是否存在該值的方法,不存在返回-1,存在返回下標
        int index=find(array,value);
        if(index!=-1){
            //迴圈遍歷
            for(int i=index;i<array.length;i++){
                //從查詢為null的位置開始,從後向前覆蓋
                array[i]=array[i+1];
            }
        }
 }

陣列中的最大值

  public int findMax(int[] array){
      //先確定一個最大值,確定為第一個最方便
      int max=array[0];
      //從第二個開始比較
      for(int i=1;i<array.length;i++){
          //如果數值大於指定的最大值,將值賦值給最大值
          if(array[i]>max){
              max=array[i];
          }
      }
      return max;
  }

氣泡排序法:

public void sort(int[] array){
  //外層迴圈控制比較的輪數
  //最後一次只剩一個時不用再比較
  for(int i=0;i<array.length-1;i++){
    //內層迴圈控制每輪要比較的次數
    //迴圈了多少論,下一輪就少比較多少次(每一輪都多出一個不再參與比較的數)
    for(int i=0;j<array.length-1-i;j++){
      //如果後一位更大,將大的數換到最後
      if(array[j+1]<array[j]){
        //交換兩數
        int temp=array[j+1];
        array[j+1]=array[j];
        array[j]=temp;
      }
    }
  }
}

選擇排序法:

  整個排序方法和氣泡排序方式基本一致,只是冒泡比較的基數在改變

public void sort(int[] array){
  //外層迴圈控制輪數
  for(int i=0;i<array.length;i++){
    //內層迴圈控制每一次比較的輪數,將i索引的元素依次和後面的每個元素進行比較
    for(int j=i+1;j<array.length;j++){
      //升序:如果前一位更小,則將大的往後交換
      if(array[i]>array[j]){
        int temp=array[j];
        array[j]=array[i];
        array[i]=temp;
      }
    }
  }
}

快速排序法(二分排序法):

public void sort(int[] array,int left,int right){
  //判斷是否需要繼續遞迴
  if(left==right){
    teturn;
  }
  //定義基準值
  int middle=array[left];
  //i是左邊界
  int i=left;
  //j是右邊界
  int j=right;
  //當i!=j時,則繼續迴圈
  while(i!=j){
    //進入迴圈後,j從右往左,不能走過i,若j對應的位置大於基準值,則繼續向左前進
    while(array[j]>=middle&&i>i){
      j--;
    }
    //進入迴圈後,i從左往右,不能走過j,若i對應的位置小於基準值,則繼續向右前進
    while(array[i]<=middle&&i<j){
      i++;
    }
    //當i與j停下來且i!=j時,i與j沒相遇則將兩個數交換,則左邊小,右邊大
    int temp=array[i];
    array[i]=array[j];
    array[j]=temp;
  }
  //當i與j停下來且i=j時,則將該位置與基準值相交換
  array[left]=array[i];
  array[i]=middle;
  //將原陣列分兩段繼續遞迴
  sort(array,left,i-1);
  sort(array,i+1,right);
}

實現陣列元素的插入(陣列的原始資料需要連續遞增)