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 4566110 200
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語言中,二維數組是按照行排列的。即,先存放第一行,再存放第二行。