在解决某些问题的,我们需要对数据处理,排序就是一种处理方式
那如何将一些无序的数字排序成有序的呢?
我们知道当数据较多情况会使用数组来存储,利用角标也方便对数据的处理
较简单的排序方法有冒泡排序、选择排序、插入排序和计数排序,接下来我说明这4种排序:
冒泡排序:
总的来说就是相邻两个数之间比较,前者比后者大则两数交换位置
第一轮比较后最大值9就出来了
同理过多轮的操作较大的数一个个到最后面,就如冒泡一样。
代码如下:
public static void bubble(int[] arr){
for(int i=0;i<=arr.length-1;i++){
for(int j=0;j+1<=arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
swap(arr,j,j+1);
}
}
}
}
public static void swap(int[] arr,int i,int j){
int temp;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
选择排序:
一个位置的数与它后面的数做比较,若后面的数较小,则交换位置
上图是最小值1和第二小的值2排序出的流程
同原理,从小到大的数就会被选出来了
代码如下:
public static void select(int[] arr){
for(int i=0;i<=arr.length-1;i++){
for(int j=i+1;j<=arr.length-1;j++){
if(arr[i]>arr[j]){
swap(arr,i,j);
}
}
}
}
public static void swap(int[] arr,int i,int j){
int temp;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
插入排序:
一个位置的数与之前的数比较,若此位置的数较小,则交换位置
代码如下:
public static void insert(int[] arr){
for(int i=1;i<=arr.length-1;i++){
for(int j=0;j<=i-1;j++){
if(arr[i]<arr[j]){
swap(arr,i,j);
}
}
}
}
public static void swap(int[] arr,int i,int j){
int temp;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
以上三种排序方法的时间复杂度都为O()级别
计数排序:
而计数排序它的时间复杂度为O(n)级别,它的原理不是比较数字的大小,而是创建一个新的数组将数字与角标匹配,记录数组出现的次数。然后遍历新数组,根据记录的次数,输出相匹配的角标。是典型的用空间换取时间的思想。
这种方法只能针对整数来做。
代码如下:
public static void digitsSort(int[] arr){
int offset=arrmin(arr);
int[] newarr=new int[arrmax(arr)-offset+1];
for(int i=0;i<=arr.length-1;i++){
newarr[arr[i]-offset]++;
}
for(int i=0;i<=newarr.length-1;i++){
for(int j=1;j<=newarr[i];j++){
System.out.print(i+offset+" ");
}
}
}
//找arr[]数组中的最大值
public static int arrmax(int[] arr){
int max = arr[0];
for(int i=1;i<=arr.length-1;i++){
if(arr[i] > max){
max = arr[i];
}
}
return max;
}
//找arr[]数组中的最小值
public static int arrmin(int[] arr){
int min = arr[0];
for(int i=1;i<=arr.length-1;i++){
if(arr[i]<min){
min = arr[i];
}
}
return min;
}