一.排序
1.1 简单排序
核心:从要比较数组中挑出最大或最小值来确定第一位或者最后一位,一直在交换
原理:
- 利用循环,从前到后一个一个的确定
- 从每次少一个数的数组中依次寻找最值
- 寻找中转换位置
#include <stdio.h>
// 简单排序
int main( )
{
int a[8]={6,51,60,83,55,41,9,8};
int i,k;
int t;
// 大循环8次
for(i=0;i<8;i++){
// 先确定最小者
for(k=i+1;k<8;k++){
if(a[i]>a[k]){
t = a[i];
a[i]=a[k];
a[k]=t;
}
}
}
}
1.2 选择排序
核心:从要比较数组中挑出最大或最小值来确定第一位或者最后一位,循环完再交换
区别:与简单排序相比,第二层循环需要及时的交换下标值,而简单排序直接通过交换位置达到这个效果
原理:
- 利用循环,从前到后一个一个的确定
- 从每次少一个数的数组中依次寻找最值
- 利用了擂台求最值(在循环里特别注意,初始开始比较的值位置,相当于数组每次减少一个)
- 注意最后交换值从前到后
#include <stdio.h>
// 选择排序
int main( )
{
const int n = 13;
int a[]= {11,2,60,1,55,41,-2,-1,55,12,63,78,56};
int i,j,k;
int t;
// 循环n次
for(i=0;i<n;i++){
// 从前往后挑选小值(前面的数先确定)
k=i; // 稳定循环
for(j=i+1;j<n;j++){
if(a[j]<a[k]){
k=j; //擂台定最值
}
}
t = a[i];
a[i]=a[k];
a[k] = t;
}
return 0;
}
1.3 冒泡排序
核心:相邻比较,确定尾数,一直向前推进
原理:
- 相邻两个数字依次比较,把那个最值送到最后
- 然后依次进行,先确定最后一个
#include <stdio.h>
// 冒泡排序
int main( )
{
const int n = 13;
int a[]= {11,2,60,1,55,41,-2,-1,55,12,63,78,56};
int i,j;
int t;
// 循环n次
for(i=0;i<n;i++){
// 从j=1依次到n-i,每次把最大的那个数移动到最后面
for(j=1;j<n-i;j++){
//把最大的那个数移动到最后面
if(a[j]<a[j-1])
{
// 交换位置
t=a[j];
a[j]=a[j-1];
a[j-1]=t;
}
}
}
return 0;
}
二.查询
1.顺序查询
#include <stdio.h>
// 顺序查询
int main( )
{
const int n = 13;
int i;
int a[] = { 11,2,60,1,55,41,-2,-1,55,12,63,78,56 };
int b = 56;
for(i=0;i<n;i++){
if(a[i] == b){
printf("%d",i);
}
}
return 0;
}
2.折半查询
原理:通过low,high,mid的移动来确定目标,最终让mid等于目标值
#include <stdio.h>
// 顺序查询
int main( )
{
const int n = 13;
int i;
int a[] = {1,2,3,45,78,96,102,145,169,268,301,405,506};
int b=45;
int low=0,high=n-1,mid=1;
while(1){
mid = (low+high)/2;
if(b>a[mid]){
low = mid+1;
}
else if(b<a[mid]){
high = mid -1;
}
else{
printf("%d",mid);
break;
}
}
return 0;
}