1. 程式人生 > >關於篩選法求素數,選擇法對一串數字進行排序,折半查詢法查詢數字

關於篩選法求素數,選擇法對一串數字進行排序,折半查詢法查詢數字

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));
}