Java算法排序之--直接插入排序
2013-02-18 11:57
337 查看
排序之间的关系:
直接插入排序(straight insertion sort)的作法是:
每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。
直接插入排序属于稳定的排序,最坏时间复杂性为Θ(n^2),空间复杂度为O(1)。
直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。
值得注意的是,我们必需用一个存储空间来保存当前待比较的数值,因为当一趟比较完成时,我们要将待比较数值置入比它小的数值的后一位
插入排序类似玩牌时整理手中纸牌的过程。插入排序的基本方法是:每步将一个待排序的记录按其关键字的大小插到前面已经排序的序列中的适当位置,直到全部记录插入完毕为止。
初始序列:
i=1 [46] 58 15 45 90 18 10 62
↓
i=2 [46 58] 15 45 90 18 10 62
┌——┘
↓
i=3 [15 46 58] 45 90 18 10 62
┌——┘
↓
i=4 [15 45 46 58] 90 18 10 62
↓
i=5 [15 45 46 58 90] 18 10 62
┌—————┘
↓
i=6 [15 18 45 46 58 90] 10 62
┌————————┘
↓
i=7 [10 15 18 45 46 58 90] 62
┌—┘
↓
i=8 [10 15 18 45 46 58 62 90]
C/C++代码实现直接插入排序:
void insert_sort(int a[], int n)
{
int i, j, temp;
for (i = 1; i < n; ++i)
{
temp = a[i];
for (j = i; j>0 && temp < a[j - 1]; --j)
{
a[j] = a[j - 1];
}
a[j] = temp;
}
}
Java代码实现直接插入排序:
public class InsertSort {
public static void main(String[] args) {
insertSort();
}
public static void insertSort() {
int a[] = { 49, 38, 65, 97, 76, 13, 27, 49, 78, 34, 12, 64, 5, 4, 62,
99, 98, 54, 56, 17, 18, 23, 34, 15, 35, 25, 53, 51 };
int temp = 0;
for (int i = 1; i < a.length; i++) {
int j = i - 1;
temp = a[i];
System.out.println("temp1:"+temp);
for (; j >= 0 && temp < a[j]; j--) {
a[j + 1] = a[j]; // 将大于temp的值整体后移一个单位
System.out.println("a[j]"+a[j]);
}
a[j + 1] = temp;
System.out.println("temp2:"+temp);
}
for (int i = 0; i < a.length; i++)
System.out.println(a[i]);
}
}
直接插入排序(straight insertion sort)的作法是:
每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。
直接插入排序属于稳定的排序,最坏时间复杂性为Θ(n^2),空间复杂度为O(1)。
直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。
值得注意的是,我们必需用一个存储空间来保存当前待比较的数值,因为当一趟比较完成时,我们要将待比较数值置入比它小的数值的后一位
插入排序类似玩牌时整理手中纸牌的过程。插入排序的基本方法是:每步将一个待排序的记录按其关键字的大小插到前面已经排序的序列中的适当位置,直到全部记录插入完毕为止。
初始序列:
i=1 [46] 58 15 45 90 18 10 62
↓
i=2 [46 58] 15 45 90 18 10 62
┌——┘
↓
i=3 [15 46 58] 45 90 18 10 62
┌——┘
↓
i=4 [15 45 46 58] 90 18 10 62
↓
i=5 [15 45 46 58 90] 18 10 62
┌—————┘
↓
i=6 [15 18 45 46 58 90] 10 62
┌————————┘
↓
i=7 [10 15 18 45 46 58 90] 62
┌—┘
↓
i=8 [10 15 18 45 46 58 62 90]
C/C++代码实现直接插入排序:
void insert_sort(int a[], int n)
{
int i, j, temp;
for (i = 1; i < n; ++i)
{
temp = a[i];
for (j = i; j>0 && temp < a[j - 1]; --j)
{
a[j] = a[j - 1];
}
a[j] = temp;
}
}
Java代码实现直接插入排序:
public class InsertSort {
public static void main(String[] args) {
insertSort();
}
public static void insertSort() {
int a[] = { 49, 38, 65, 97, 76, 13, 27, 49, 78, 34, 12, 64, 5, 4, 62,
99, 98, 54, 56, 17, 18, 23, 34, 15, 35, 25, 53, 51 };
int temp = 0;
for (int i = 1; i < a.length; i++) {
int j = i - 1;
temp = a[i];
System.out.println("temp1:"+temp);
for (; j >= 0 && temp < a[j]; j--) {
a[j + 1] = a[j]; // 将大于temp的值整体后移一个单位
System.out.println("a[j]"+a[j]);
}
a[j + 1] = temp;
System.out.println("temp2:"+temp);
}
for (int i = 0; i < a.length; i++)
System.out.println(a[i]);
}
}
相关文章推荐
- 常用算法Java实现之直接插入排序
- 【算法拾遗(java描述)】--- 插入排序(直接插入排序、希尔排序)
- 用JAVA实现排序算法之二:直接插入排序
- Java常见排序算法之直接插入排序
- java实现 排序算法之直接插入排序
- 【算法拾遗(java描写叙述)】--- 插入排序(直接插入排序、希尔排序)
- java实现排序算法之2-路插入排序,直接插入排序,折半插入排序
- Java常用排序算法之直接插入排序
- Java与算法之(9) - 直接插入排序
- 算法:排序----直接插入排序(Java)
- java实现排序算法之插入排序(直接插入排序,折半插入排序,希尔排序)
- 一步步学习数据结构和算法之直接插入排序效率分析及java实现
- Java算法之直接插入排序
- java实现排序算法之直接插入排序
- 16周项目1-验证算法(1)直接插入排序 显示过程
- 算法---直接插入排序法
- 直接插入排序及其JAVA实现
- java实现直接插入排序
- 直接插入排序 java
- 第十六周上机实践—项目1(1)—验证算法 直接插入排序 折半插入排序