冒泡排序
方法:
第一次先从第一个数据开始,比较相邻的元素,如果第一个比第二个大(或者小)就交换他们两个, 一直比较到最后一个数,此时找到了一个最大(或者最小的)的数。
然后第二次和第一次方法一样,但是比第一次少比较一个数,以后每次比前一次比较数少一;然后一直到第n-1组。
需要对比的次数为n-1次,每次需要对比的数为n-1-i个,中间通过x来交换两值的位置。
代码:
int x;
for (int i = 0; i < n- 1; i++) //比较n-1次
{
for (int j = 0; j <n-1-i; j++) //还有n-i个数未必比较
{
if (a[j]>a[j + 1])
{ //将两个数交换位置
x = a[j + 1];
a[j + 1] = a[j];
a[j] = x;
}
}
}
图解
插入排序
方法:
每次将无序的数列中第一个元素与有序数列的元素从后到前依次比较,找到插入位置,将该元素插入到合适的地方。
先用x储存将要插入的值的大小,然后用while循环来在有序数列中找到合适的位置,若大於则x,则往后移动一位,最后找到合适的位置,再将x赋值到该位置。
代码:
int x;
for (int i = 1; i < 10; i++)
{
x = a[i];
int j = i;
while (a[j - 1] > x)
{
a[j] = a[j - 1];
j--;
}
a[j] = x;
}
图解:
选择排序
方法:
第一次从所有的元素中选出最小(或最大)的一个元素,然后存放在序列的起始位置;再从剩余的无序元素中寻找到最小(大)元素,然后放到第二位。以此类推。
下面用x来存放本次最大(或最小的值),xx来存放该值的位置,等全部比较完后再通过y值交换两值。
代码:
int x, y,xx;
for (int i = 0; i < n-1; i++)
{
x = a[i];
xx = i;
for (int j = i; j < n; j++)
{
if (x>a[j])
{
x = a[j];
xx = j;
}
}
y = a[i];
a[i] = x;
a[xx] = y;
}
图解
希尔排序
方法:
先把元素按一定的间隔分组,然后对每组使用插入排序算法排序;然后随着间隔逐渐减少,每组都逐渐变得有序,混乱度减小,当增量减至1时,整个文件恰被分成一组,算法便终止。
注意:代码进行插入排序时,增量变为间隔i,而不再是之前的自增k++,自减k--。此时为k+=i,k-=i。
代码:
for (int i = 10 / 2; i > 0; i = i / 2) //每次的间隔i
{
for (int j = 0; j < i; j++) //分为i组,分组比较
{
int x;
for (int k = j + i; k < 10;) //每组进行插入排序
{
x = a[k];
int m = k;
while (a[m - i] > x)
{
a[m] = a[m - i];
m -= i;
}
a[m] = x;
k += i;
}
}
}