无整理 不简书
常用的排序算法有冒泡排序、选择排序、插入排序、快速排序,下面简单介绍四种排序方法的思路与实现代码。
例:四种排序算法把整数 6 23 14 56 78 32 按照从小到大的顺序排序。
1.冒泡排序
此例中每次筛选都通过相邻元素的比较把较大的元素移到右侧,一次筛选结束最大的元素移动到最右侧,筛选出来的最大的元素不再参与下一次筛选的比较。6个元素每次筛选出一个最大值,筛选5次就可以确定出顺序。比较次数是未筛选出的整数个数减1。
6 23 14 56 78 32
第一次筛选:
第一次比较:6 23 不交换
6 23 14 56 78 32
第二次比较:23 14 交换
6 14 23 56 78 32
第三次比较:23 56 不交换
6 14 23 56 78 32
第四次比较:56 78 不交换
6 14 23 56 78 32
第五次比较:78 32 交换
6 14 23 56 32/78(第一个最大整数)
第二次筛选:
第一次比较:6 14 不交换
6 14 23 56 32/78
第二次比较:14 23 不交换
6 14 23 56 32 /78
第三次比较:23 56 不交换
6 14 23 56 32 /78
第四次比较:56 32 交换
6 14 23 32 /56(第二个最大整数) 78
第三次筛选:
第一次比较:6 14 不交换
6 14 23 32 /56 78
第二次比较:14 23 不交换
6 14 23 32 /56 78
第三次比较:23 32 不交换
6 14 23 /32(第三个最大整数) 56 78
第四次筛选:
第一次比较:6 14 不交换
6 14 23 /32 56 78
第二次比较:14 23 不交换
6 14 /23(第四个最大整数) 32 56 78
第五次筛选:
第一次比较:6 14 不交换
6 /14(第五个最大整数) 23 32 56 78
排序结果:6 14 23 32 56 78
实现代码:
//冒泡排序
int[] a = {6, 23, 14, 56, 78, 32};
for(int i = 0;i < a.length - 1;i++)
{
for(int j = 0;j < a.length-1-i;j++)
{
if(a[j] > a[j+1])
{
int temp;
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
2.选择排序
定义一个变量记录最小元素的索引,先假设第一个元素为最小值,最小元素的索引为0,后面的元素分别与第一个元素进行比较,当某一元素小于最小元素时,当前元素的索引赋值给定义的变量,继续与后面的元素进行比较,重复上述操作,所有元素比较完成后,变量中记录的是最小元素的索引,把第一个元素与最小元素进行互换,第一次筛选结束,再进行下一次筛选,筛选出来的最小元素不再参与下一次的筛选。
6 23 14 56 78 32
第一次筛选:
index = 0
第一次比较:6 23 不大于
第二次比较:6 14 不大于
第三次比较:6 56 不大于
第四次比较:6 78 不大于
第五次比较:6 32 不大于
最小值的索引为0,最小元素放在最左侧
6(第一个最小元素) \23 14 56 78 32
第二次筛选:
index = 1
第一次比较:23 14 大于
index = 2
第二次比较:14 56 不大于
第三次比较:14 78 不大于
第四次比较:14 32 不大于
最小值的索引为2,14 与 23互换
6 14(第二个最小元素)\ 23 56 78 32
第三次筛选:
index = 2
第一次比较:23 56 不大于
第二次比较:23 78 不大于
第三次比较:23 32 不大于
最小索引为2,最小元素放在最左侧
6 14 23(第三个最小元素)\56 78 32
第四次筛选:
index = 3
第一次比较:56 78 不大于
第二次比较:56 32 大于
index = 5
最小索引为5,56 与 32互换
6 14 23 32 (第四个最小元素)\78 56
第五次筛选:
index = 4
第一次比较:78 56 大于
index = 5
最小索引为5,78 与 56互换
6 14 23 32 56(第五个最小元素)\78
排序结果:6 14 23 32 56 78
实现代码:
int[] a = {6, 23, 14, 56, 78, 32};
for(int i = 0; i < a.length; i++)
{
int min = i;
for(int j = i + 1; j < a.length; j++)
{
if(a[min] > a[j])
{
min = j;
}
}
if(min != i)
{
int temp;
temp = a[min];
a[min] = a[i];
a[i] = temp;
}
}
3.插入排序
假设刚开始只有一个元素,每次取后面的一个元素与前面元素比较,如果取出的元素小于前面的元素,那么与前面进行互换,再与前面的元素进行比较,重复操作,直到取出的元素比前面的元素大为止。每次取出一个元素到最终不再比较为一次插入,最后一个元素插入完成,排序结束。
6 23 14 56 78 32
第一次插入:
第一次比较:23 6 大于
23在6后面不动
第二次插入:
第一次比较:14 23 小于
14 与 23 互换
6 14 23 56 78 32
第二次比较:14 6 大于
14 在 6 后面不动
第三次插入:
第一次比较:56 23 大于
56 在 23 后面不动
第四次插入:
第一次比较:78 56 大于
78 在 56 后面不动
第五次插入:
第一次比较:32 78 小于
32 与 78 交换
6 14 23 56 32 78
第二次比较:32 56 小于
32 与 56 交换
6 14 23 32 56 78
第三次比较:32 23 大于
32 在 23 后面不动
排序结果:6 14 23 32 56 78
实现代码:
int[] a = {6, 23, 14, 56, 78, 32};
for(int i = 1; i < a.length; i++)
{
for(int j = i; j > 0; j--)
{
if(a[j] < a[j - 1])
{
int temp;
temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
}else
{
break;
}
}
}
4.快速排序
快速排序理解较难,我另起一篇文章,请参照下方链接:
快速排序思想与实现
如有错误之处,请指正。
网友评论