二維數組已選擇排序、折半查找



  1)選擇排序

     選擇排序思想:
  選擇排序(Selection sort)是一種簡單直觀的排序算法。
  工作原理:首先在未排序序列中找到最小元素,存放到排序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小元素,然後放到排序序列末尾。依次類推,直到所有元素均排序完畢。
 選擇排序代碼實現:
      void xuanZe(int nums[],int len){
 int temp;
 for(int i=0;i<len-1;i++){
for(int j=i+1;j<len-1;j++){
if(nums[i]>nums[j]){
temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
}
 }
 }
 
 void main(){
     int nums[10]={15,32,14,18,45,75,34,74,44,77};
 printf("排序前:");
 for(int i=0;i<10;i++){
printf("%d\t",nums[i]);
 }
 xuanZe(nums,10);
 printf("排序後:");
 for(int i=0;i<10;i++){
printf("%d\t",nums[i]);
 }
 }  
  
  2)折半查找思想
     基本思路:
        在有序列表中,取中間元素作爲比較對象,若給定值與中間元素的要查找的數相等,則查找成功;若給定值小於中間元素的要查找的數,則在中間元素的左半區繼續查找;
        若給定值大於中間元素的要查找的數,則在中間元素的右半區繼續查找。不斷重複上述查找過程,直到查找成功,或所查找的區域無數據元素,查找失敗。
     實現步驟:
        a、low=1;high=length;//設置初始區間
b、當low>high時,返回查找失敗信息//表空,查找失敗
c、當low≤high,mid=(low+high)/2;  //取中點
   ①、若key<arr[mid],high=mid-1; 轉b  //查找在左半區進行
②、若key>arr[mid],low=mid+1;  轉b  //查找在右半區進行
③、若key=arr[mid],返回數據元素在表中位置  //查找成功
注:折半查找前提:在一個有序數組中查找。
  例如:key=45;
      0 1 2 34
  12 4566110200
  l mh
  循環:mid=(l+h)/2; 如上:m=(0+4)/2;
  key(值是45)<a[mid](值是66)
  h=m-1;
  key(值是45)>a[mid](值是12)
  l=m+1;
  key(值是45)=a[mid](值是45)-->查找到
  3)折半查找的代碼實現
   a、測試練習1
      //使用折半查找來查找一個數
 //arr是數組
 //len是數組長度
 //key是要查找的數(關鍵字)
 //return 返回要查找的數的位置,如果查找不到,返回 -1
 int searchItem(int arr[],int len,int key){
int low=0,high=len-1,mid;
while(low<=high){
mid=(low+high)/2;
if(key>arr[mid]){
low=mid+1;
}else if(key<arr[mid]){
high=mid-1;
}else{
return mid;
}
}
//如果查找不到,返回-1
return -1;
 }
 
 int main(){
int arr[]={3,4,12,20,21,23,28,45,67,100};
//查找key值=20
int loc=searchItem(arr,10,20);
printf("loc = %d\n",loc);
 }
 
b、測試練習2 
 //輸入一組有序數據,使用折半查找法插入一個數據,返回要插入數據的位置,假設插入45
      //3,4,12,20,21,23,28,45,67,100 
  int InsertItemLoc(int arr[],int len,int key){
int low=0,high=len-1,mid;
while(low<=high){
mid=(low+high)/2;
if(key>arr[mid]){
low=mid+1;
}else if(key<arr[mid]){
high=mid-1;
}else{
return mid+1;
}
}
//如果查找不到,返回low
return low;
  }
  int main(){
int arr[]={3,4,12,20,21,23,28,45,67,100};
//查找key值=20
int loc=InsertItemLoc(arr,10,45);
printf("loc = %d\n",loc);
  }
  
  4)二維數組定義
      a、二維數組的應用:俄羅斯方塊、五子棋、象棋等
     所謂多維數組就是二維和大於二維的數組,在C語言中並不直接支持多維數組,包括二維數組。多維數組的聲明是使用一維數組的嵌套聲明實現的。一個一維數組的每個元素又被聲明爲一維數組,從而構成二維數組,可以說二維數組是特殊的一維數組。
 b、二維數組的定義
     類型說明符 數組名[常量表達式1][常量表達式2]
 其中常量表達式1表示第一維下標的長度,常量表達式2表示第二維下標的長度。
 例如:int[3][4];
 聲明瞭一個三行四列的數組,數組名爲a,其下標變量的類型爲整型,該數組的下標變量共有3*4個。  
 c、二維數組定義的注意事項
     ①數組名不能和變量名同名;
 ②數組的長度可以是常量表達式;
 ③數組長度可以使用宏定義 #define M  3    int arr[M+3][6]
          ④二維數組第一維可以省略,第二維不可以省略
 
  5)二維數組初始化
      a、定義的同時初始化
     ①完全初始化
     法一:int arr[3][2]={{1,4},{2,6},{5,3}};//分段初始化
 法二:int arr[3][2]={1,4,6,8,5,4};//連續賦值
 法三:int arr[][3]={{1,2,3},{2,3,4},{2,6,4}};//可以省略第一維
 法四:int arr[][2]={1,2,4,3,6,4,7,5};
 ②部分初始化
     int arr[2][3]={1};//默認初始化爲{{1,0,0},{0,0,0}}
 int arr[2][3]={{1},{2}};//默認初始化爲{{1,0,0},{2,0,0}}
 int arr[2][3]={1,2,3,4};////默認初始化爲{1,2,3,4,0,0}
 b、先定義,後初始化
      int a[3][4];
  a[0][0]=1;
  a[0][1]=2;
  ...
  a[0][4]=1;
  a[1][0]=1;
      a[1][1]=1;
  ...
  a[1][4]=1;
      a[3][0]=1;
      a[3][1]=1;
  ...
  a[3][4]=1;
  
  6)二維數組遍歷
      a、二維數組的元素也稱爲雙下標變量,其表示形式爲:
     數組名[第一維下標][第二維下標]
 其中下標應爲整型常量或整型表達式。
  
  7)二維數組存儲
      ①二維數組在概念上是二維的,即是說其下標在兩個方向上變化,下標變量在數組中的位置也處於一個平面之中,而不是像一維數組只是一個向量。但是,實際的硬件存儲器卻是連續編址的,也就是說存儲器單元式按照一維線性排列的。
      如何在一維存儲器中存放二維數組:
          a、按行排列,即放完一行之後順次放入第二行;
          b、按列排序,即放完一列之後再順次放入第二列。
      ②存儲方式;
  a、計算機會給二維數組分配一塊連續的存儲空間;
  b、數組名代表數組的首地址,從首地址位置依序存入第一行,第二行....
  c、每一行存儲方式,從行首地址開始,依次存儲行的第一個元素、第二個元素...
  d、每個元素佔用相同的字節數(取決於數組類型)
  e、並且數組中元素之間的地址是連續的。
      ③注:在C語言中,二維數組是按照行排列的。即,先存放第一行,再存放第二行。
  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章