排序
数组是任何计算机语言中非常重要的知识点,在数组中非常重要的知识点就是排序,简称重中之重。排序为什么这么重要呢?首先,排序是我们最先接触到的算法,至于算法的重要性我就不多说了,学好排序能够有助于培养我们的算法思想。其次,排序的种类有很多,因此它能够解决我们遇到的许多难题。最后,排序能够有效的训练我们打代码的能力。因此,学好排序是至关重要的。
排序的方法有很多种:选择排序、冒泡排序、插入排序、归并排序、堆排序、快速排序(二路排序、三路排序)、计数排序、基数排序、桶排序,但是这一次只总结了选择排序、冒泡排序、插入排序、计数排序,因为其他的难度较大,现在还有些吃力。
冒泡排序
那先从冒泡排序说起吧,因为冒泡排序比较简单,先易后难嘛,嘿嘿。
冒泡排序的原理:重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。一直重复直到不再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。那是如何比较两个元素的呢?很简单,就是比大小。如果前一个数字比后一个数字大的话,两者就要交换位置,直到最后两个数字比较完毕,这样,当前最大的数就排在最后,但是一次只能确定一个最大的数字,因此,这个数组有多少个元素就要比较 [ 元素-1 ] 轮,因为最后一轮是和自己比较,没有意义,所以可以省略。
一大段的文字可能很难理解这个原理,那么就用一张图来说明一下:
代码如下:
public static void bubbleSort(int[] arr){
int len=arr.length;
int k=0;
for(int i=0;i<len-1;i++){
for(int j=0;j<len-i-1;j++){
if(arr[j]>arr[j+1]){
k=arr[j+1];
arr[j+i]=arr[j];
arr[i]=k;
}
}
}
}
选择排序
选择排序是一种比较直观的排序方法,也就是说更容易我们大家理解。
选择排序的原理:当前元素和之后所有的元素进行比较,如果前者大于后者,则交换。也就是说,每次寻找的都是序列中的最小值,然后放在最前面的位置。这和冒泡排序敲好相反,但是因为是一一进行比较,所以比较直观,利于理解。
下面还是用一张图来说明一下:
代码如下:
public static void selectSort(int[] arr){
int len=arr.length;
int k=o;
for(i=0;i<len-1;i++){
for(int j=i+1;j<len;j++){
if(arr[i]>arr[j]){
int temp;
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
插入排序
插入排序的工作原理:确认一个数字的左边有数字,然后比较两个数字大小,若是左边的数字大,则交换两个数字的位置。
代码如下:
public static void insertSort(int[] arr){
int e;
int j;
for(int i=1;i<arr.length;i++){
int e=arr[i];
for(int j=i;j>0&&arr[j-1]>e;j--){
arr[j]=arr[j-1];
}
arr[j]=e;
}
}
计数排序
假设n个输入,每个都是介于0到k的整数。计数排序的基本思想是对每一个输入元素x,确定出小于x的元素个数。有了这一信息,直接x放到对应的位置上就行了。比如说有5个元素小于x,那就把x放到第六个位置上。当有元素相等时,需要略作修改,因为不能把他们都放在同一个位置上。
代码如下:
public static void countSort(int[] arr){
int min=arr[0];
int max=arr[0];
for(int i=0;i<arr.length;i++){
if(arr[i]<min){
min=arr[i];
}
if(arr[i]>max){
max=arr[i];
}
}
int[] nums=new [max-min+1];
int offset=min;
for(int i=0;i<arr.length;i++){
nums[arr[i]+offset]++;
}
int index=0;
for(int i=0;i<arr.length;i++){
if(nums[i]!=0){
for(int j=0;j<nums[i];j++){
arr[index]=i+offset;
}
}
}
}