插入排序
ai前面的i-1个元素都是有序的,再插入第n个
直接插入排序:
直接把an和前面的n-1个依次比较
折半插入排序:
前面的n-1个先取中间的和an比较
希尔排序:
交换排序:
冒泡排序:
每一次都把剩下的数里最大的放最后
代码:
#include <stdio.h>
#define MAXN 10000
int main()
{
int i, index, j, n, temp, k;
int a[MAXN];
scanf("%d", &n);
for(i = 0; i<n; i++){
scanf("%d", &a[i]);
}
for(i = 1; i<n; i++){
for(k = 0; k<n-1; k++){
if(a[k]>a[k+1]){
temp = a[k];
a[k] = a[k+1];
a[k+1] = temp;
}
}
}
for(i = 0; i<n; i++){
if(i == 0){
printf("%d", a[i]);
}else{
printf(" %d", a[i]);
}
}
return 0;
}
快速排序:
基本思想:
任取一个元素(如第一个)为中心;
所有比它小的元素一律前放,比它大的元素一律后放,形成左右两个子表;
对各子表重新选择中心元素并依此规则调整, 直到每个子表的元素只剩一个
选择排序:
简单选择排序:
在待排序的数据中选出最大/小的元素放在其最终位置
写代码时应注意:
1.用序号而不是原数查找 2.元素的交换与各层嵌套的关系 3.每一个a[i]和a[index]比较
#include <stdio.h>
#define MAXN 10000
int main()
{
int i, index, k, n, temp;
int a[MAXN];
scanf("%d", &n);
for(i = 0; i<n; i++){
scanf("%d", &a[i]);
}
for(k = 0; k<n-1; k++){
index = k;
for(i = k+1; i<n; i++){
if(a[i]<a[index]){
index = i;
}
}
temp = a[index];a[index] = a[k];a[k] = temp;
}
for(i = 0; i<n; i++){
if(i == 0){
printf("%d", a[i]);
}else{
printf(" %d", a[i]);
}
}
return 0;
}
堆排序:
若在输出堆顶的最小值(最大值)后,使得剩余n-1个元素的序列重又建成一个堆,则得到n个元素的次小值(次大值)……如此反复,便能得到一个有序序列,这个过程称之为堆排序。
建立堆:先初始无序地顺序存到二叉树里。从倒数第二层开始让每一个结点为根的子树都调整为堆
去掉堆顶之后再次调整成一个堆:以堆中最后一个元素替代之;然后将根结点值与左、右子树的根结点值进
行比较,并与其中小者进行交换
归并排序:
将两个有序子序列归并成一个(比较两个指针所指的元素,谁小就要谁,并且指针后移)。排序时,先两两分组,再把它们归并成一个
桶排序:
即分配+收集:先按个位排,在桶里的都是按顺序拿和放,再十位,再百位

