(2020.9.10)算法
練習3:windows
在一個有序數組中查找某個具體數字n。編寫int binsearch(int x,int v[],int n);數組
功能:在v[0]<=v[1]<=v[2]...<=v[n-1]的數組中查找xide
方法一:函數
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };spa
int k = 7;字符串
int i = 0;it
int sz = sizeof(arr) / sizeof(arr[0]);(計算元素個數)io
for (i = 0; i < sz; i++)class
{
if (k == arr[i])(而不是k==sz,由於arr[i]求出來的是下標)
{
printf("找到了,下標是:%d\n",i);
break;
}
}
if (i == sz)
printf("找不到");
(結果爲6,而7的下標確實是6)
1的下標是0
折半查找算法/二分查找算法(方法二)能夠提升效率,
最多大概找log以2爲底數的n次:
舉例子:
2^32次方=42億多,最多隻需查找32次
最右下標即爲元素個數-1
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int left = 0;
int k = 7;
int sz = sizeof(arr) / arr[0];
int right = sz - 1;(left和right分別表明下標,因此要sz-1)
int mid = (left + right) / 2;
while (left<=right)(只有這樣才保證,由於有可能找不到所需元素以後
,左下標跑到右下標的右邊)
{
if (arr[mid] > k)
{
right = mid - 1;
}
if (arr[mid < k])
{
left = mid + 1;
}
else
{
printf("找到了,下標是:%d\n", mid);
break;(由於外面加了循環,因此要break才能停下來)
}
}
if (left > right)
{
printf("找不到");(只有當left<=right不知足的狀況纔會跳到底下,
或者break以後來到這裏)
}
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
while (left<=right)
{
int mid = (left + right) / 2;
if (arr[mid] > k)
{
right = mid - 1;
}
else if (arr[mid] < k)
{
left = mid + 1;
}
else
{
printf("找到了,下標是%d\n", mid);
break;
}
}
if (left > right)
{
printf("找不到");
}
(從新打了一遍,這一次沒有錯,以前一直出錯但不知道緣由)
這個代碼哪些地方值得注意:
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
while (left<=right)(只有left<=right時說明中間有元素,此時才能
進行查找)
{
int mid = (left + right) / 2;(每次查找都要經過左右元素來肯定
一箇中間元素的下標,那這個中間元素與鎖定的元素去比較)
if (arr[mid] > k)
{
right = mid - 1;
}
else if (arr[mid] < k)(mid是指的下標,而k指的是元素)
{
left = mid + 1;
}
else
{
printf("找到了,下標是%d\n", mid);
break;(當找到了這個元素要跳出來)
}
}
if (left > right)
{
printf("找不到");
}
練習4:
編寫代碼,演示多個字符從兩端移動,向中間匯聚
char arr1[] = "welcom to bit!!!!!!";
char arr2[] = "##################";
int left = 0;
int right = sizeof(arr1) / sizeof(arr1[0]) - 2;(是減去2不是1由於數組元素末尾
還包括一個\0,若是隻是-1,獲得的結果是\0而不是末尾的字符感嘆號)
能夠把上面那句話改爲:
int right=strlen(arr1)-1;(把\0前面的元素個數求出來,因爲下標老是
比元素個數少一,因此減去1)
strlen:用來求字符串長度,但個數裏面不包括\0,遇到\0就中止
庫函數就必須引用頭文件
char arr1[] = "welcome to bit!!!!!!";
char arr2[] = "####################";
int left = 0;
int right = strlen(arr1) - 1;
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
Sleep(1000);(1秒=1000毫秒,做用:每打印一次後停留1秒,而且S記得
大寫,必須引用頭文件,#include<windows.h>)
system("cls");system:是用來執行系統命令的一個函數,(cls--清空屏幕),
因爲system是庫函數,須要引用頭文件#include<stdlib.h>
left++;
right--;
}
printf("welcome to bit!!!!!!");