JAVA 十种内部排序实现(选择 冒泡 插入 希尔 堆 归并 快速 基数 计数 桶)及代码
时间:2026-01-14
时间:2026-01-14
1.选择排序
2.冒泡排序
3.插入排序
4.希尔排序
5.堆排序
6.归并排序
7.快速排序
8.基数排序
9.计数排序
10.桶排序
1.选择排序
这个排序方法最简单,废话不多说,直接上代码:
public class SelectSort{
/**
*选择排序
*思路:每次循环得到最小值的下标,然后交换数据。
*如果交换的位置不等于原来的位置,则不交换。
*/
public static void main(String[]args){ selectSort(Datas.data);
Datas.prints("选择排序");
}
public static void selectSort(int[]data){ int index=0;
for(int i=0;i<data.length;i++){
index=i;
for(int j=i;j<data.length;j++){
if(data[index]>data[j]){
index=j;
}
}
if(index!=i){
swap(data,index,i);
}
}
}
public static void swap(int[]data,int i,int j){ int temp=data[i];
data[i]=data[j];
data[j]=temp;
}
}
选择排序两层循环,第一个层循环遍历数组,第二层循环找到剩余元素中最小值的索引,内层循环结束,交换数据。内层循环每结束一次,排好一位数据。两层循环结束,数据排好有序。
2冒泡排序
冒泡排序也简单,上代码先:
public class BubbleSort{
/**
*冒泡排序
*思路:内部循环每走一趟排好一位,依次向后排序
*/
public static void main(String[]args){
bubbleSort(Datas.data);
}
private static void bubbleSort(int[]data){ int temp;
for(int i=0;i<data.length;i++){
for(int j=i+1;j<data.length;j++){
if(data[i]>data[j]){
temp=data[i];
data[i]=data[j];
data[j]=temp;
}
}
}
Datas.prints("冒泡排序");
}
}
冒泡排序和选择排序有点像,两层循环,内层循环每结束一次,排好一位数据。不同的是,数据像冒泡一样,不断的移动位置,内层循环结束,刚好移动到排序的位置。
该图对应上面的代码进行的说明,没有用专门的画图工具,使用的是window的maspint,大家凑合着看哈^_^明白意思就成!
3插入排序
插入排序也是简单的排序方法,代码量不多,先看代码:
public class InsertSort{
/**
*插入排序
*思路:将数据插入到已排序的数组中。
*/
public static void main(String[]args){
int[]data=Datas.data;
int temp;
for(int i=1;i<data.length;i++){
temp=data[i];//保存待插入的数值
int j=i;
for(;j>0&&temp<data[j-1];j--){
data[j]=data[j-1];
//如果带插入的数值前面的元素比该值大,就向后移动一位}
//内部循环结束,找到插入的位置赋值即可。
data[j]=temp;
}
Datas.prints("插入排序");
}
}
该图是上面插入排序的说明图,插入排序,其过程就是其名字说明的一样,将待排序的数据插入到已排序的数据当中。两层循环,内层循环结束一次,插入排序排好一位数据。
4希尔排序
希尔排序,也叫缩减增量排序,其中增量的设置影响着程序的性能。最好的增量的设置为1,
3,5,7,11,。。。这样一组素数,并且各个元素之间没有公因子。这样的一组增量叫
做Hibbard增量。使用这种增量的希尔排序的最坏清醒运行时间为θ()
当不使用这种增量时,希尔排序的最坏情形运行时间为θ()
这里电脑打印这些太麻烦,干脆手写拍照啦哈哈哈哈。。。。。
好了,废话不多说,上代码;
public class ShellSort{
/**
*希尔排序(缩减增量排序)
*想想也不难。
*思路:三层循环
*第一层循环:控制增量-增量随着程序的进行依次递减一半
*第二层循环:遍历数组
*第三层循环:比较元素,交换元素。
*这里需要注意的是:比较的两个元素和交换的两个元素是不同的。
*/
public static void main(String[]args){
int[]data=Datas.data;
int k;
for(int div=data.length/2;div>0;div/=2){
for(int j=div;j<data.length;j++){
int temp=data[j];
for(k=j;k>=div&&temp<data[k-div];k-=div) {
data[k]=data[k-div];
}
data[k]=temp;
}
}
Datas.prints("希尔排序");
}
}
程序中,需要注意的是第三层循环,第三层循环的代码中,if语句的比较和内部的交换是分别不同的两个数据。原因是:把大的数据后移,小的数据前移,形成这样一种趋势,才能实现排序。
当然可以试试,if语句比较的两个数据和内部移动的数据一致的话,会出现什么问题?出现的问题就是移动的数据打破了之前形成的大的数据在后,小的数据在前的趋势。无法排序。5堆排序
堆排序,要知道什么是堆?说白了,堆就是完全二叉树,堆是优先队列。要求父元素比两个子元素要大。这就好办了。数组元素构建堆,根节点最大,删除根节点得到最大值,剩下的
元素再次构建堆,接着再删除根节点,得到第二大元素,剩下的元素再次构建堆,依次类推,得到一组排好序的数据。为了更好地利用空间,我们把删除的元素不使用新的空间,而是使用堆的最后一位保存删除的数据。
代码上来:
public class HeapSort{
/**
*堆排序(就是优先队列)
*也就是完全二叉树
*第一步:建堆.其实就是讲数组中的元素进行下虑操作,
*使得数组中的元素满 …… 此处隐藏:2226字,全部文档内容请下载后查看。喜欢就下载吧 ……