1.折半查找算法:
对于一个已排好序的数组,若要查找某元素是否属于数组中,则可以用这种算法。
返回找到的元素在数组中的下标,找不到则返回-1 #include <stdio.h>
#define LEN 8 int a[LEN] = { 1, 3, 3, 3, 4, 5, 6, 7 }; int binarysearch(int number) { int mid, start = 0, end = LEN - 1; while (start <= end) { mid = (start + end) / 2; if (a[mid] < number) start = mid + 1; else if (a[mid] > number) end = mid - 1; else return mid; } return -1; }
折半查找的递归实现:
int binarysearch(int number,int start,int end){
int mid;
if(start <= end) {
mid = (start + end) / 2;
if (a[mid] < number)
binarysearch(number,mid+1,end);
else if (a[mid] > number)
binarysearch(number,start,mid-1);
else return mid; } return -1; }
2.选择排序法:总需排N-1次
算法:
第1次:找到数组中的最小的元素与第一个元素交换位置
第2次:从第二个元素开始,找到当前数组中的最小元素与第二个元素交换位置
第3次:从第三个元素开始,找到当前数组中的最小元素与第三个元素交换位置
.
.
.
第N-1: 同上。。。
void sort(int list[],int n){
int i,j,min,temp;
for(i = 0;i<n-1;i++){
min = i;
for(j = i+1;j<n;j++)
if(list[j]<list[min])
min = j;
temp = list[i];
list[i] = list[min];
list[min] = temp;
}
}
3.插入排序算法类似于玩扑克时抓牌的过程,玩家每拿到一张牌都要插入到手中已有的牌里,使之从小到大排好序。
#include <stdio.h> #define LEN 5 int a[LEN] = { 10, 5, 2, 4, 7 }; void insertion_sort(void) { int i, j, key; for (j = 1; j < LEN; ++j) { printf("%d, %d, %d, %d, %d ", a[0], a[1], a[2], a[3], a[4]); key = a[j]; i = j - 1; while (i >= 0 && a[i] > key) { a[i+1] = a[i]; --i; } a[i+1] = key; } printf("%d, %d, %d, %d, %d ", a[0], a[1], a[2], a[3], a[4]); } int main(void) { insertion_sort(); return 0; }