简单排序方式
冒泡排序
对于数组个数比较少的,我们可以采用冒泡排序的方法来进行排序,他的原理其实是利用两层循环来进行比较,如果n个数要进行排序,那至少要进行n-1次的回合,而且每次需要排n-i次,就像吐泡泡一样,因此可以进行以下代码的编写
1 public static void main(String[] args) {
2 //冒泡排序法,外层控制循环的趟数n-1,内层控制比较的次数n-i
3 int[] a={20,100,30,1,12,1,120,32};
4 int len=a.length;
5 for (int i = 1; i < len; i++) {
6 for(int j=0;j<len-i;j++){
7 if(a[j]>a[j+1]){
8 int temp=a[j];
9 a[j]=a[j+1];
10 a[j+1]=temp;
11 }
12 }
13 }
14 System.out.println(Arrays.toString(a));
15 }
对于数组个数很多的,我们可以采用其他方法排序,能有效提高计算机的运行速度,冒泡法每次都要去比较所以会相对比较而言比较慢
插入排序
插入排序的原理:将指针指向某元素(一般从第二个元素开始),假设该元素的左侧全部有序,将该元素抽取,然后按照从右往左的顺序分别与其左边的元素进行比较,遇到较大的元素便将较大的元素往右移,直到找到比该元素小的或者最左面发现其右侧的元素都比他大的时候,停止,此时会出现一个空位,将指针所指向的元素放到空位中,此时该元素左侧的元素都比他小,右侧的元素都比他大,此时指针向后移一位,重复进行上述操作,毎操作一轮,左侧有序元素就加一个,右侧无序元素就少一个。
通俗来讲,外层循环从第i个元素开始(第一次i=2)比较到len,内层循环从i-1(i左边第一个元素)开始进行向左循环,与相邻元素进行比较,如果条件满足将右边元素往左移
原理不是很好懂,但是用实际操作来讲就很容易理解,给定一组数:297,34,56,12
第一轮:指针最初第二个元素34,从右向左开始比较一次,只有一个元素297,297>34,将297后移,空出一个位置,将34填进去
得到:34,297,56,12
第二轮:指针指向下一个元素,56,从右向左开始比较两次,有两个元素34,297,其中297大于56,34小于56,找到比自己小的元素了,297往后移,56填补空位
得到:34,56,297,12
第三轮:指针指向下一个元素,12,从右向左开始比较三次,有三个元素34,56,297,297,56,34都比12大,找不到比自己小的元素,其他元素往右移,空出第一个元素的位置,此时12填入
得到:1,34,56,297
int[]a={12,87,32,34,2,6};
int len=a.length;
for (int i = 1; i < len; i++) {//从第二个元素开始从右往左比较
int temp=a[i];//将a【i】抽出来进行比较
int leftIndex=i-1;//左边元素索引值为i-1
while (leftIndex>=0&&a[leftIndex]>temp)//向右移
{
a[leftIndex+1]=a[leftIndex];//左边元素值移到右边元素
leftIndex--;//如果左边还是大于右边,索引值往左,而且必须大于零在循环条件里面加上
}//移完之后,空出一个位置a[左边空出的索引,原本是i,后来变成了leftindex+1],需要用a【i】去填补
a[leftIndex+1]=temp;
}
System.out.println(Arrays.toString(a));
选择排序
选择排序的原理:
从第一个元素开始,分别于后面的元素相比较,遇到最小值就交换位置,第一轮结束;从第二个元素开始,分别与后面的元素相比较,找到倒数第二小的元素,并交换位置,重复上述步骤,直到排序完成。
定义一个数组:int[] a={12,34,16,7};
第一轮:
指针指向第一个元素12,先与34作比较,最小还是12;再与16作比较,最小还是12;再与7作比较,最小值7。
输出结果:7,34,16,12
第二轮:
指针指向第二个元素,先与16作比较,最小16,交换;再与7做比较,最小7,交换
输出结果:7,12,16,34
第三轮:
指针指向第三个元素,与34做比较,最小16
输出结果:7,12,16,34
public static void main(String[] args) {
int[] array={12,8,24,6};//定义一个数组
//第一轮排序
int len=array.length;
for (int i=0;i<len-1;i++){
int min=array[i];//每一轮回的最小值都是array[i]
int minIdenx=i;//最小值的索引值每一轮回都是i
for(int j=i+1;j<len;j++){
if(min>array[j]){//如果前面的值大于后面的值,最小值为后面的
min=array[j];
minIdenx=j;//找到最小值的索引
}
}
if(i!=minIdenx){//如果最小值是自己可以不用进行下面交换
int temp=array[i];
array[i]=min;
array[minIdenx]=temp;
}
}
System.out.println(Arrays.toString(array));
}
原理很好懂,但是感觉每次都要与最小值交换会有点多余,代码还是自己多敲敲,可以直接用最值得索引来进行交换值
private static void demo6() {
int[] a={10,5,23,2,3,56,1,7,9,11};
int len=a.length;
for (int i = 0; i < len; i++) {
int min=i;
for(int j=i+1;j<len;j++){
if(a[min]>a[j]){
min=j;//找到最小值索引
}
}
//将最小索引所对应的值与i交换位置
int temp=a[i];
a[i]=a[min];
a[min]=temp;
}
System.out.println(Arrays.toString(a));
}