一、选择排序
思想:
为合适的位置,选择一个合适的数
//选择排序
int arr[6] = {1,77,98,76,6,8};
int len = sizeof(arr)/sizeof(arr[0]);
int i = 0,j = 0,t = 0;
for(j = 0;j < len - 1;j++) //找位置
{
//for(i = 0;i < len - j;i++) //找数字法一
for(i = 1;i < len - j;i++) //找数字法二
{
if(arr[j] > arr[i+j]) //交换
{
t = arr[j];
arr[j] = arr[i+j];
arr[i+j] = t;
}
}
}
for(i = 0;i < len;i++) //打印排序好的数组
{
printf("%d ",arr[i]);
}
二、冒泡排序
思想:
相邻两个元素两两比较,小的放前,大的放后
//冒泡排序
int arr[] = { 8,7,6,5,4,3,2,1 };
int len = sizeof(arr) / sizeof(arr[0]); //8
int t = 0;
int i = 0, j = 0;
for (j = 0; j < len - 1; j++) //趟数
{
for (i = 0; i < len - j - 1; i++) //每趟的次数
{
if (arr[i] > arr[i + 1]) //交换
{
t = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = t;
}
}
}
for (i = 0; i < len; i++) //打印排序好的数组
{
printf("%d ", arr[i]);
}
三、插入排序
思想:排队
//插入排序
int a[6] = {6,5,4,3,2,1};
//int b[6] = {0};(思考媒介)
int len = sizeof(a)/sizeof(a[0]);
int i = 0,j = 0,t = 0;
for(i = 0;i < len;i++) //取数
{
t = a[i];
j = i;
while(j > 0 && a[j-1] > t) //后移找位置
{
a[j] = a[j - 1];
j--;
}
a[j] = t; //将对应的值放在合适的位置
}
for(i = 0;i < len;i++) //打印排序好的数组
{
printf("%d ",a[i]);
}
四、二分查找
前提:有序数组
//二分查找
int s1[6] = {1,2,3,4,5,6};
int len = sizeof(s1) / sizeof(s1[0]);
int mid = 0,begin = 0,end = len - 1;
int n = 3;
while(begin <= end) //注意是<=
{
mid = begin + end;
if(s1[mid] > n)
{
end = mid - 1;
}
else if(s1[mid] < n)
{
begin = mid + 1;
}
else
break;
}
if(begin <= end) //代表是从break出来的
{
printf("找到了,下标是%d",mid);
}
else
printf("没找到");
五、快速排序
代码:
系统自带qsort函数
//定义结构体类型
struct student
{
char name[20];
int sno;
float score;
};
//通过系统自带qsort函数来对根据学号大小,分数,姓名进行排序
//调用qsort函数只用写出compar的比较函数内容即可
int compar(const void *a,const void *b)
{
const struct student *p1 = a;
const struct student *p2 = b;
// return p1->sno - p2->sno;
// return p1->score - p2->score;
return strcmp(p1->name,p2->name);
}
//实现通过键盘输入结构体成员数据的函数
void inputstudent(struct student *p,int len)
{
int i = 0;
for(i = 0;i < len;i++)
{
printf("name:");
scanf("%s",(*(p+i)).name);
// scanf("%s",(p+i)->name); //or
printf("age:");
scanf("%d",&(*(p+i)).sno);
// scanf("%d",&(p[i].sno)); //or
printf("score:");
scanf("%f",&(*(p+i)).score);
}
}
//实现输出结构体成员数据的函数
void outputstudent(struct student *p,int len)
{
int i = 0;
for(i = 0;i < len;i++)
{
printf("%s\n",(*(p+i)).name);
// printf("%s",(p+i)->name);
printf("%d\n",(*(p+i)).sno);
// printf("%d",(p+i)->sno);
printf("%.2f\n",(*(p+i)).score);
}
}
int main()
{
struct student s1[3];
// inputstudent(s1,3);
// outputstudent(s1,3);
// maxscore(s1,3);
struct student s2[3] = {{"b",2,12},{"a",1,11},{"c",3,13}}; //调用系统自带的qsort函数
qsort(s2,3,sizeof(struct student),compar);
outputstudent(s2,3);
return 0;
}
六、算法稳定性 和 效率( 时间 -- 时间复杂度 )
选择排序、冒泡排序、插入排序时间复杂度相同