俗话说:万事开头难。我注册了博客园一年多了,本来一直想坚持写写博客,锻炼一下自己的思维,更重要的是培养对技术的兴趣,感受技术的魅力。还有一个目的是,将自己在工作中遇到的问题以及想法做一个总结,方便以后查阅和更新。希望每天都能进步一点。
废话不多说,现进入正题。作为一个Java开发工程师,今天要讲的话题是关于数组排序的方法,包括:冒泡排序法、选择排序法。有不妥之处还请各路大神不吝赐教。
1.冒泡排序法
定义:所谓冒泡排序法顾名思义是对这种排序方法的比喻,其原理是:循环遍历数组中的元素,就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。
举例:
public static void bubbleSortSequence(int []arr) { int[] arr = {72,23,34,27,66,56,78}; for(int i =0;i<arr.length-1;i++) { for(int j=0;j<arr.length-i-1;j++) {//-1为了防止溢出 if(arr[j]>arr[j+1]) { int temp = arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } }
时间复杂度为O(n2)。关键的技术点:数组中两个元素交换位置时,需要定义一个第三方变量。这个第三方变量起着媒介的作用。类比生活中的例子:
有A、B、C三个等量的杯子,其中A中盛的是水,B中盛的是饮料,C为空杯。若想将A中的水与B中的饮料交换一下位置,则需要空杯容器C来做媒介。
也可以用位异或运算来实现。代码如下:
public static void bubbleSortSequence(int []arr) { int[] arr = {72,23,34,27,66,56,78}; for(int i =0;i<arr.length-1;i++) { for(int j=0;j<arr.length-i-1;j++) {//-1为了防止溢出 if(arr[j]>arr[j+1]) { arr[j]=arr[j]^arr[j+1]; arr[j+1]=arr[j]^arr[j+1]; arr[j]=arr[j]^arr[j+1]; } } } }
2.选择排序法
定义:是一种能将一串数据依照特定的方式进行排列的方法。其原理:在需要排序的一组数中,选出最小(或最大)的一个数与第一个位置的数交换;在剩下的数当中找最小的数与第二个位置的数交换,即顺序放在已排好序的数列的最后,如此循环,直到全部数据元素排完为止
举例如下:
public static void selectSequence(int[] arr) { //定义最小元素的下标和一个临时变量 int min, temp; for (int i = 0; i < arr.length; i++) { // 初始化最小数据数组下标 min = i; for (int j = i+1; j < arr.length; j++) { // 在未排序元素中继续寻找最小元素,赋值给最小值的下标 if (arr[j] < arr[min]) { min = j; } } // 将最小元素放到已排序列末尾 if (min != i) { temp = arr[min]; arr[min] = arr[i]; arr[i] = temp; } } }
这里稍微比较难理解的是最小元素的一直在变化,其实仔细推理一下,不难明白这个最小元素不是单单指此数组中的最小元素,而是此组数中未排序数列的最小元素。这个算法的时间复杂度也为O(n2)。