關於篩選法求素數,選擇法對一串數字進行排序,折半查詢法查詢數字
1.關於篩選法求素數
演算法描述: 原理很簡單,就是當i是質(素)數的時候,i的所有的倍數必然是合數。如果i已經被判斷不是質數了,那麼再找到i後面的質數來把這個質數的倍數篩掉。
如圖:
程式碼描述l:(查詢100以內的素數)
#include <stdio.h>
#include <stdlib.h>
int SiftPrime(int n)
{
int i,j;
int *p = (int *)malloc(n*sizeof(int));
for(i=0;i<n;i++)
{
p[i]=1;
p[0]=p[1]=0;
for(i=2;i<n;i++)
{
for(j=i+1;j<n;j++)
if(j%i==0)
{
p[j]=0;
}
}
}
for(i=0;i<n;i++)
{
if(p[i]!=0)
printf("%-4d",i);
}
return 0;
}
int main()
{
SiftPrime(100);
return 0;
}
2. 選擇法對一串數字進行排序
演算法描述:
選擇法排序指每次選擇所要排序的陣列中的最大值(由小到大排序則選擇最小值)的陣列元素,將這個陣列元素的值與最前面沒有進行排序的陣列元素的值互換。以數字9、6、15、4、2為例,採用選擇法實現數字按從小到大進行排序,每次交換的順序如下圖所示
程式碼描述:(用選擇法對1,9,2,4,3,6,10進行排序)
void SelectSort(int *arr,int len)
{
int min;
int tmp;
for(int i = 0;i < len;i++)
{
min = i;
for(int j = i+1;j < len;j++)
{
if(arr[min] > arr[j])
{
min = j;
}
}
if(min != i)
{
tmp = arr[i];
arr[i] = arr[min];
arr[min] = tmp;
}
}
}
int main()
{
int arr[]={1,9,2,4,3,6,10};
int len = sizeof(arr)/sizeof(arr[0]);
SelectSort(arr,len);
Show(arr,len);
return 0;
}
3.折半查詢法查詢陣列元素
演算法描述:
搜尋過程從陣列的中間元素開始,如果中間元素正好是要查詢的元素,則搜尋過程結束;如果某一特定元素大於或者小於中間元素,則在陣列大於或小於中間元素的那一半中查詢,而且跟開始一樣從中間元素開始比較。如果在某一步驟陣列為空,則代表找不到。
程式碼描述:
int BinSearch(int *arr,int len,int key)
{
int low = 0;
int high = len-1;
int mid;
while(low <= high)
{
mid = (low+high)/2;
if(arr[mid] == key)
{
return mid;
}
else if(arr[mid] < key)//在右邊找
{
low = mid+1;
}
else
{
high = mid-1;
}
}
return -1;
}int main()
{
int arr[] = {1,2,3,5,7,9,10};
int len = sizeof(arr)/sizeof(arr[0]);
for(int i=0;i<len;i++)
{
printf("%d\n",BinSearch(arr,len,arr[i]));
}
printf("%d\n",BinSearch(arr,len,0));
printf("%d\n",BinSearch(arr,len,7));
printf("%d\n",BinSearch(arr,len,13));
}