目录
元素的查找
线性查找
从第一个元素开始查找,一直到第n个;
int findEle(int a[], int n, int x)
{
int i;
for(int i = 0; i < n&&a[i] != x; i++);
if(i >= n) return -1;
else return i;
}
折半查找
反复把查找区间折半;
int binarySearch(int a[], int n, int x)
{
int i, j, m;
for(i = 0, j = n-1; i <= j;)
{
m = (i + j)/2;
if(x == a[m]) return m;
else if(x > a[m]) i = m + 1;
else j = m - 1;
}
return -1;
}
递归二分查找
和上面不用递归本质上是一样的
int recBiSearch(int a[],int x,int i,int j)
{
int m;
if (i<=j)
{
m = (i + j)/2;
if (x == a[m])
return m;
else if (x < a[m])
return recBiSearch(a,x,i,m-1);
else
return recBiSearch(a,x,m+1,j);
}
else return -1;
}
排序
直接插入排序
void insertSort(int a[],int n) {
int i,j,tmp;
for (i=1; i<n; i++){
tmp = a[i];
for (j=i-1; j>=0 && a[j]>tmp; j--){
//若已排序列比之大则后移
a[j+1] = a[j];
}
a[j+1] = tmp;//插入当前元素
}
最后采用j+1是因为for循环结束时采用了j--的操作,需要使用+1来弥补
选择排序
void selectSort(int a[],int n)
{ int i,j,max,tmp;
for (i=1; i<=n-1; i++){
max = n-i;
for (j=0; j<=n-1-i; j++){
if (a[j] > a[max])
max = j;
}
if (n-i != max){
tmp = a[n-i];
a[n-i] = a[max];
a[max] = tmp;
}
}
}
冒泡排序
void bubbleSort(int a[],int n){
int i,j,tmp;
for (i=1;i<=n-1;i++){
for (j=0;j<=n-1-i;j++){
if (a[j]>a[j+1]){
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
冒泡算法改进——没有交换就终止
int bubbleSort2(int a[],int n)
{
int i,j,tmp,swap;
for(i=1,swap=1; i<=n-1 && swap>0; i++){
for(j=0,swap=0; j<=n-1-i; j++){
if(a[j] > a[j+1]){
tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
swap++;
}
}
}
return i;//返回排序的趟数
}