冒泡排序
#include "myhead.h"
//封装冒泡排序
int bubblesort(int *buf)
{
int i,j;
for(i=0; i<9; i++) //决定循环几轮
{
for(j=0; j<9-i; j++)
{
//前面的元素大于后面的元素,就交换
if(buf[j]>buf[j+1])
{
int temp;
temp=buf[j];
buf[j]=buf[j+1];
buf[j+1]=temp;
}
}
}
}
int main()
{
int buf[10]={78,5,45,7,123,745,85,963,1,25};
bubblesort(buf);
printf("排序完毕结果是:\n");
for(int i=0; i<10; i++)
printf("%d ",buf[i]);
printf("\n");
}
快速排序
#include <stdio.h>
/*
思想:把第一个数作为基准数,排完一轮之后找到基准数的正确位置,左边的都是比基准数小的,右边都是比基准数大的
接着递归调用自己,对左边的继续排序,对右边的继续排序
从头到尾,另一个从尾到头,以a[0]作为基准值(一般都是选这个),第一次排序完毕a[0]左边的都比它小
右边的都比它大
先从右往左找一个小于基准数的数,再从左往右找一个大于基准数的数,然后交换他们
*/
//快速排序
void sort(int a[], int left, int right)
{
int tem;
int j,k;
int buf;
if(left > right) //0 9
return;
tem = a[left];//初始化基准数a[0]==3
j = left;
k = right;
while(j != k) //只要j和k没有撞到一起,循环继续
{
while(a[k] >= tem && j != k)//从右到左开始寻找比基准数小的数
k--;
while(a[j] <= tem && j != k)//从左到右开始找比基准数大
j++;
if(j != k) //交换位置
{
buf = a[k];
a[k] = a[j];
a[j] = buf;
}
}
// 只要左边的下标j和右边的下标k重叠了,就退出上面的循环了,
a[left] = a[j];//将基准数放在合适的位置 1 1 3 5
a[j] = tem; //此时的j是个分界线 1 2 3 5
//递归调用自己,分别对左右两边的数据继续使用快速排序
sort(a,left,j - 1);//继续进行左区域的排序 2 1 3 5
sort(a,j + 1,right);//右
return;
}
int main(int argv, char *argc[])
{
int i;
int array[] = {3,1,5,2,4,9,0,8,7,6};
sort(array,0, 9);
for(i = 0; i < 10; i++)
printf("%d ",array[i]);
printf("\n");
return 0;
}
选择排序
#include "myhead.h"
//封装选择排序
int selectionsort(int *buf)
{
int i,j;
int temp;
int max;
for(j=0; j<9; j++)
{
//定义一个变量记录当前的最大值下标
max=j; //假设数组下标为j的是最大值
for(i=j+1; i<10; i++) //找到目前的最大值
{
if(buf[i]>buf[max])
max=i;
}
//跟数组下标j的交换
if(max!=j)
{
temp=buf[max];
buf[max]=buf[j];
buf[j]=temp;
}
}
}
int main()
{
int buf[10]={78,5,45,7,123,745,85,963,1,25};
selectionsort(buf);
printf("排序完毕结果是:\n");
for(int i=0; i<10; i++)
printf("%d ",buf[i]);
printf("\n");
}
直接插入排序
#include <stdio.h>
/*
对于基本有序(较小的排在前面,较大的排在后面,不大不小排在中间),记录数少的采用直接插入排序效率最高
思想:不断地将一个个数据插入到一个已经排好序的有序表中
*/
void insertsort(int buf[],int n)
{
int i,j,temp;
for(i=1; i<n; i++) //i=4 j=3
{
if(buf[i]<buf[i-1])
{
temp=buf[i]; //2保存
for(j=i-1; buf[j]>temp && j>=0; j--) //把前面排好序的挪动,找到temp存放的位置
buf[j+1]=buf[j];
buf[j+1]=temp;
}
}
}
int main()
{
int buf[7]={45,125,4,78,965,6,100};
insertsort(buf,7);
printf("排序完毕:\n");
for(int i=0; i<7; i++)
printf("%d ",buf[i]);
printf("\n");
}
二分查找
#include <stdio.h>//二分查找算法即测试用例
int BinySerch(int *arr, int x, int lengh)
{
int left = 0, right = lengh - 1;
int mid ;
while (left <= right)
{
mid = left + (right - left) / 2;
if (x < arr[mid])
{
right = mid - 1;
}
else if (x > arr[mid])
{
left = mid + 1;
}
else
{
return mid;
}
}
return -1;
}
哈希表的原理
拉链法解决哈希冲突