冒泡排序
冒泡排序:它的时间复杂度为O(n^2),虽然不及堆排序、快速排序的O(nlogn,底数为2),但是有两个优点:
1.“编程复杂度”很低,很容易写出代码;
2.具有稳定性,这里的稳定性是指原序列中相同元素的相对顺序仍然保持到排序后的序列,而堆排序、快速排序均不具有稳定性。不过,一路、二路归并排序、平衡二叉树排序的速度均比冒泡排序快,且具有稳定性,但速度不及堆排序、快速排序。
基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。
- public static int[] bubbleSort(int[] arr)
- {
- for(int i=0;i<arr.length-1;i++)
- {
- for(int j=i+1;j<arr.length;j++)
- {
- if(arr[i]>arr[j])
- {
- int temp;
- temp=arr[j];
- arr[j]=arr[i];
- arr[i]=temp;
- }
- }
- }
- return arr;
- }
复制代码 简单选择排序:
在简单选择排序过程中,所需移动记录的次数比较少。最好情况下,即待排序记录初始状态就已经是正序排列了,则不需要移动记录。最坏情况下,即待排序记录初始状态是按逆序排列的,则需要移动记录的次数最多为3(n-1)。简单选择过程中需要进行的比较次数与初始状态下待排序的记录序列的排列情况无关。当i=1时,需进行n-1次比较;当i=2时,需进行n-2次比较;依次类推,共需要进行的比较次数是∑ =(n-1)+(n-2)+…+2+1=n(n-1)/2,即进行比较操作的时间复杂度为O(n2)。这种方法其实是对冒泡排序的深入。
- public static int[] selectSort(int[] arr)
- {
- for(int i=0;i<arr.length-1;i++)
- {
- int min = i;
- for (int j=i+1;j<arr.length;j++)
- {
- if(arr[min]>arr[j])
- min = j;
- }
- if(min!=i)
- {
- int temp = arr[i];
- arr[i] = arr[min];
- arr[min] = temp;
- }
- }
- return arr;
- }
复制代码
|