大家好,今天给大家介绍几种常见的排序方法,随着学习的深入,写的排序方法会更多。欢迎大家留言点赞!
目录:
1.冒泡排序
2.选择排序
3.插入排序
4.计数排序
1.冒泡排序
冒泡排序最为简单,像冒泡泡一样。有若干个数,例如{1,3,2,1},假如我以升序进行排序,从第一对开始1和3进行比较,前面比后面大就进行交换,这里不用更换,再比较3和2中谁较大,3大就和2交换,然后比较3和1谁大,3比较大,再一次进行交换,进行了一次遍历找出来最大的数排在了最后,此时为{1,2,1,3},由此循环再找出第二大的数,直到找完为止。
流程图如下:
java code:
import java.util.Arrays;
class BubbleSort{
public static void main(String []args) {
int[] arr={2,1,3,4,6,5,7,9,8};
for(int i=0;i<arr.length-1;i++){//进行依次比较。
for(int j=i;j<arr.length-1;j++){
if(arr[j]>arr[j+1]){
swap(arr,j,j+1);
}
}
}
System.out.print(Arrays.toString(arr));
}
public static void swap(int[] arr,int i,int j){//进行交换
int temp=0;
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
2.选择排序
选择二字说明这个排序过程是选择最大值或者最小值的过程,这里输出一个升序序列,先找出一系列数中的最小值,如{4,2,3,1}先将第一个数作为最小的数,遍历寻找有无更小的数,如果有,就进行交换,先将4与2进行交换,变为{2,4,3,1},此时最小值为2,继续往下找,找到1比2小,将2与1交换,变为{1,4,3,2},循环一次找出一个最小值,继续循环遍历,便可得出排序结果。
流程图如下:
java code:
import java.util.Arrays;
class SelectSort{
public static void main(String []args) {
int[] arr={2,1,3,4,6,5,7,9,8};
for(int i=0;i<arr.length;i++){//遍历寻找最小元素进行替换
int min =i; //先将第一个元素作为最小值
for(int j=i+1;j<arr.length;j++){//将第二个元素以及后面的数与其比较并交换。
if(arr[min]>arr[j]){
swap(arr,min,j);
}
}
}
System.out.print(Arrays.toString(arr));
}
public static void swap(int[] arr,int i,int j){//两数交换
int temp=0;
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
3.插入排序
插入排序,重点在于插入,就像打麻将一样,你刚把牌拿起来后,通常需要根据大小进行排序,将未排序的牌插入已排序的牌中。
思想是:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
实现流程:
(1) 设置监视哨r[0],将待插入记录的值赋值给r[0];
(2) 设置开始查找的位置j;
(3) 在数组中进行搜索,搜索中将第j个记录后移,直至r[0].key≥r[j].key为止;
(4) 将r[0]插入r[j+1]的位置上。
java code:
import java.util.Arrays;
class InsertSort{
public static void main(String []args) {
int[] arr={2,1,3,4,6,5,7,9,8};
for(int i=0;i<arr.length;i++){//将一个元素插入到已排序的序列中。
for(int j=i;j>0;j--){
if(arr[j]<arr[j-1]){
swap(arr,j,j-1);
}else{
break;
}
}
}
System.out.print(Arrays.toString(arr));
}
public static void swap(int[] arr,int i,int j){
int temp=0;
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
4.计数排序
仅适用于整数,并且待排序中数字最大值于最小值相差不大,否则浪费许多空间。基本思想是,根据需排序的序列的最大值和最小值确定一个范围,利用数组下标来存储元素,数组中的元素代表该元素出现的次数。
java code:
class CountSort{
public static void main(String []args) {
int[] arr={2,1,3,4,6,5,7,9,8,8,7};
//offse=0-1=-1,brr[1]++
//并以其插值创建新数组用于计数,且原数组与新数组之间的对应角标相差0-min。
//遍历找到max和min。
int max=arr[0];
int min=arr[0];
for(int i=0;i<arr.length;i++){
if(arr[i]<min){
min=arr[i];
}else if(arr[i]>max){
max=arr[i];
}
}
int[] brr=new int[max-min+1];
int offse=0-min;
//根据新数组中的下标是原数组中出现的元素,下标对应的元素是该元素出现的次数,
//注意不能直接打印新数组,打印新数组输出的是下标出现的次数。
for(int i=0;i<arr.length;i++){
brr[arr[i]+offse]++;
}
System.out.print("[");
for(int i=0;i<brr.length;i++){
for(int j=0;j<brr[i];j++){
System.out.print(i+1+" ");
}
}
System.out.print("]");
}
}
到此先告一段落。待更。