冒泡排序
冒泡排序算法的运作:
1.比较相邻的元素,如果第一个比第二个大,就交换他们两个。
2.对每一对相邻的元素做同样的工作,从开始第一对到结尾最后一对。在这一点,最后的元素应该是最大的数
3.针对所有元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
图解
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define LEN 10
int main(){
int a[LEN];
int i = 0;
int flag,temp;
//产生十个随机数(0~20)
srand((unsigned)time(NULL));
while(i < LEN){
flag = 1;
temp = rand()%20+0;
for (int j = 0; j < i; j++){
if (temp == a[j]){
flag = 0;
break;
}
}
if (flag){
a[i] = temp;
i++;
}
}
//打印生成的数组
for (int i = 0; i < LEN; i++)
printf("%d ",a[i]);
printf("\n");
//冒泡排序算法
for (int i = 0; i < LEN-1; i++){
for (int j = 0; j < LEN-i-1; j++ ){
if (a[j] > a[j+1]){
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
//打印排好序的数组
for (int i = 0; i < LEN; i++){
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
选择排序
思路:每次从待排序的数组中选出最小或者最大的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
#include <stdio.h>
#define LEN 10
int main(){
int min_id; //存放最小值下标
int temp; //数据交换的临时存储
int a[LEN] = {5,4,6,8,7,2,9,1,0,3};
for (int i = 0; i < LEN-1; i++){
min_id = i;
for (int j = i+1; j < LEN; j++){
if (a[j] < a[min_id]){
min_id = j;
}
}
temp = a[i];
a[i] = a[min_id];
a[min_id] = temp;
}
for (int i = 0; i < LEN; i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
思路:插入排序原理很简单,将一组数据分成两组,分别将其称为有序组与待插入组。每次从待插入组中取出一个元素,与有序组的元素进行比较,并找到合适的位置,将该元素插到有序组当中。就这样,每次插入一个元素,有序组增加,待插入组减少。直到待插入组元素个数为0。当然,插入过程中涉及到了元素的移动。
图解:
代码:
#include <stdio.h>
#define LEN 10
int main(){
int temp; //拿出来的值
int a[LEN] = {5,4,6,8,7,2,9,1,0,3};
for (int i = 1,j; i < LEN; i++){
j = i;
temp = a[i];
while(j > 0 && a[j-1] > temp){
a[j] = a[j-1];
j--;
}
a[j] = temp;
}
for (int i = 0; i < LEN; i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
归并排序
快速排序
关于这两个算法后面再补充!