一。选择排序:
1.原理:
首先,找数组中最小的元素,把它与第一个位置的元素进行交换。然后,找到第二个最小的元素,并用数组中的第二个位置的元素进行交换。这样进行下去,直到整个数组排序完毕。
2.java代码示例:
package com.qingbyqing.algorithm;
public class Selectionsort1 {
static int[] a = { 2, 3, 1, 43, 23, 32, 5, 7, 4, 0, 31, 4, 7};
public static void main(String[] args) {
for (int i = 0; i < a.length - 1; i++) {
int minIndex = i;// 最小元素
for (int j = i + 1; j < a.length; j++) {
if (a[minIndex] > a[j]) {// 比较
minIndex = j;
continue;
}
}
// 交换
int temp = a[i];
a[i] = a[minIndex];
a[minIndex] = temp;
}
// 测试输出结果
for (int k = 0; k < a.length; k++) {
System.out.print(a[k] + " ");
}
}
}
3.简单说明:
对于从1到N-1次的每一个i,有一次交换和N-1次的比较,所以一共有N-1次交换和(N-1)+(N-2)+......+2+1=N(N-1)/2次比较,无论输入数据是怎样的。
选择排序唯一依赖输入部分的事min的更新次数,所以一般选择排序运行效率跟输入的数据关系不大。
二。插入排序:
1.原理:
在数组中将较大的元素向右移动一个位置,为要插入的元素腾出空间,然后较小的元素插入到这个空位置上。
2.java代码示例:
package com.qingbyqing.algorithm;
public class Insert {
static int[] a = { 9, 4, 5, 7, 23, 3, 1, 4, 0, 6 };
public static void main(String[] args) {
for (int i = 1; i < a.length; i++) {
for (int j = i; j > 0; j--) {
if (a[j] < a[j - 1]) {// 比较
// 交换
int temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
}
}
}
// 测试输出结果
for (int k = 0; k < a.length; k++) {
System.out.print(a[k] + " ");
}
}
}
3.简单说明:
插入排序的比较交换要根据 输入的数据而定:最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较交换操作需(n-1)次即可。最坏情况就是,序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。所以,如果需要排序的数据量比较小,有一定的顺序用插入排序还是一个不错的选择。
三。冒泡排序:
1.原理:
不断的遍历元素,交换倒序的相邻元素,直到排序完成
2.java代码示例:
package com.qingbyqing.algorithm;
public class Bubble {
static int a[] = { 9, 4, 5, 7, 23, 3, 1, 4, 0, 6 };
public static void main(String[] args) {
for (int i = 0; i < a.length; i++) {
for (int j = i + 1; j < a.length; j++) {
if (a[i] > a[j]) {// 比较
// 交换
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
// 测试输出结果
for (int k = 0; k < a.length; k++) {
System.out.print(a[k] + " ");
}
}
}
3.简单说明:
冒泡排序要要比选择排序,插入排序慢,它一般来说要进行N^2/2次 比较和交换,而选择排序一般进行N^2/2次比较,交换需要N次;插入排序最坏的情况下才需要N^2/2比较和交换,一般情况下只需N^2/4次比较和交换即可。但是冒泡排序的最大优点是:实现简单。
四。希尔排序:
1.原理:
插入排序很慢,是因为它只能交换相邻的元素,因此数组中的元素只能移动一个位置,希尔排序是插入排序的一个简单的扩展,它允许相隔很远的元素进行交换从而提高了速度。
先取一个小于数组长度的整数h1作为第一个增量,把一个数组的全部元素分成h1个组。所有距离为h1的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量h2<h1重复上述的分组和排序,直至所取的增量ht=1(ht<ht-l<…<h2<h1),即所有记录放在同一组中进行直接插入排序为止。
2.java代码示例:
package com.qingbyqing.algorithm;
public class ShellSort {
static int[] a = { 2, 3, 1, 43, 23, 32, 5, 7, 4, 0, 31, 4, 7 };
public static void main(String[] args) {
// 分组
for (int h = a.length / 2; h > 0; h /= 2) {
// 组内使用直接插入排序法排序(增量由1变成h)
for (int i = h; i < a.length; i++) {
int temp = a[i];
int j = 0;
for (j = i; j >= h; j -= h) {
if (temp < a[j - h]) {// 比较
a[j] = a[j - h];
} else {
break;
}
}
// 交换
a[j] = temp;
}
}
// 测试输出结果
for (int k = 0; k < a.length; k++) {
System.out.print(a[k] + " ");
}
}
}
3.简单说明:
在希尔排序开始时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来增量hi逐渐缩小,分组数逐渐减少,而各组的记录数目逐渐增多,但由于已经按hi-1作为距离排过序,使文件较接近于有序状态,所以新的一趟排序过程也较快。
- 大小: 8.5 KB
分享到:
相关推荐
六种内部排序算法比较:直接插入排序、希尔排序、冒泡排序、快速排序、选择排序、堆排序。包含实验报告和源代码设计。
7大排序算法(快速排序,冒泡排序,选择排序,归并排序,插入排序,希尔排序,堆排序)实现源码
C# 排序算法大全参考资料,比较清淅的一个版本。集中介绍了C#中的冒泡算法、选择排序、插入排序、希尔排序等常用算法,并包含示例代码和注意事项等。
C# 常用经典算法,选择排序 冒泡排序 快速排序 插入排序 希尔排序
JAVA排序算法: 直接插入,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序,包括算法的详细介绍,以及对几种算法的详细测试
本文介绍了C#的四种排序算法:冒泡排序、选择排序、插入排序和希尔排序 冒泡排序、选择排序、插入排序和希尔排序
10种排序算法代码+综合比较代码(直接插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序、基数排序、折半插入排序、2路插入排序),其中不仅有各种排序算法的代码,还包含10种代码在关键字...
printf("\t7: 希尔排序\n"); printf("\t***************************\n"); scanf("%d",&i); //输入整数1-7,选择排序方式 switch (i){ case 1: InsertSort(R); break; //值为1,直接插入排序 case 2: ...
排序算法汇总P: 冒泡排序快速排序直接选择排序插入排序希尔排序 堆排序........
排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序.mht
排序算法: 1、插入排序 2、希尔排序 3、冒泡排序 4、快速排序 5、简单选择排序 6、堆排序
数据结构之排序算法 包含目前所有排序方法: 1 快速排序 2 冒泡排序 3 堆排序 4 希尔排序 5 直接插入排序 6 直接选择排序 7 基数排序 8 箱、桶排序 9 归并排序
各种常用c++排序算法,包括插入排序、冒泡排序、选择排序、快速排序、归并排序、希尔排序等
了解冒泡,选择,插入,希尔排序 基本的渐进分析
关于c#的一些算法 选择排序 冒泡排序 快速排序 插入排序 希尔排序 归并排序 基数排序 计数排序。。。
本文件是7种常用排序算法的实现(C++),包括冒泡排序、选择排序、直接插入排序、希尔排序、堆排序、归并排序以及快速排序。代码详细有注释且有测试用例。
各种排序算法的实现函数:包括冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序。 查找最大最小值函数 findMinMax:在给定数组中查找最大值和最小值。 计算平均值...
排序算法汇总(选择排序 ,直接插入排序,冒泡排序,希尔排序,快速排序,堆排序)
快速排序、选择排序、冒泡排序、希尔排序、插入排序、懒人排序等6种排序算法C实现
七种排序算法(包括直接插入排序,折半插入排序,希尔排序,冒泡排序,快速排序,简单选择排序,归并排序) 还有两道题 1./*设计并实现一个有效的对n个整数重排的算法,使得所有负数位于非负数之前,给出算法的性能...