java排序算法,排序都有哪几种算法?
排序的算法有分别有:
1、插入排序 (直接插入排序、希尔排序)
2、交换排序(冒泡排序、快速排序)
3、选择排序(直接选择排序、堆排序)
4、归并排序
5、分配排序(箱排序、基数排序)
直接插入排序:
每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。
直接插入排序Java版本的代码实现:
public class MainTest {
public static void main(String[] args) {
int[] a = { 46, 58, 15, 45, 90, 18, 10, 62 };
int n = a.length;
int i, j;
for (i = 0; i < n; i++) {
int temp = a[i];
for (j = i; j > 0 && temp < a[j-1]; j–) {
a[j] = a[j - 1];
}
a[j] = temp;
}
for(i=0;i<n;i++){
System.out.print(a[i]+”\t”);
}
}
}
希尔排序是插入排序的一种。是针对直接插入排序算法的改进,是将整个无序列分割成若干小的子序列分别进行插入排序。
希尔排序:先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,组内进行直接插入排序;然后取d2<d1,重复上述分组和排序操作;直至di=1,即所有记录放进一个组中排序为止。
冒泡排序:
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
冒泡排序java版本的代码实现如下:
public class BubbleSort{
public void sort(int[] a) {
int temp = 0;
for (int i = a.length – 1; i > 0; –i) {
for (int j = 0; j < i; ++j) {
if (a[j + 1] < a[j]) {
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
}
快速排序:
快速排序是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
快速排序java版本的代码实现如下:
public class QuickSort{
public static void main(String[] ary){
int[] arry = {49, 38, 65, 97, 76, 13, 27};
sort(arry, 0, arry.length – 1);
}
/**
* 一次排序单元,完成此方法,key左边都比key小,key右边都比key大。
* @param array 排序数组
* @param low 排序起始位置
* @param high 排序结束位置
* @return 单元排序后的数组
*/
private static int sortUnit(int[] array, int low, int high){
int key = array[low];
while (low < high){
//从后向前搜索比key小的值
while (array[high] >= key && high > low)
–high;
//比key小的放左边
array[low] = array[high];
//从前向后搜索比key大的值,比key大的放右边
while (array[low] <= key && high > low)
++low;
//比key大的放右边
array[high] = array[low];
System.out.println(low + “,” + high);
}
//左边都比key小,右边都比key大。将key放在游标当前位置。此时low等于high
array[high] = key;
System.out.println(Arrays.toString(array));
return high;
}
/**
* 快速排序
* @param arry
* @return
*/
public static void sort(int[] array, int low, int high){
if (low >= high) return;
//完成一次单元排序
int index = sortUnit(array, low, high);
//对左边单元进行排序
sort(array, low, index – 1);
//对右边单元进行排序
sort(array, index + 1, high);
}
}
直接选择排序:
直接选择排序也是一种简单的排序方法,它的基本思想是:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,….,第i次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换,…..,第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列.