一.冒泡排序
1.基本思想
冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
2.思路
核心:两两比较(交换)
(1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。
(2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
(3)针对所有的元素重复以上的步骤,除了最后一个。
(4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
3.代码
public static void bubbleSort(int[] numbers) {
//从小到大 从第一个开始
//
for(int i=0;i<numbers.length;i++){
for(int j=0;j<numbers.length-i-1;j++){
if(numbers[j]>numbers[j+1]){
int temp = numbers[j];
numbers[j] = numbers[j+1];
numbers[j+1] = temp;
}
}
}
for (int k:numbers) {
System.out.println(k);
}
}
测试:
int[] arr = {8,7,9,1,3,2,4,5,6};
MySorts.bubbleSort(arr);
结果:
1 2 3 4 5 6 7 8 9
4.优缺点
(1)优点
比较简单,空间复杂度较低,是稳定的
(2)缺点
时间复杂度太高,效率不好
二.快速排序
1.基本思想
快速排序的原理:选择一个关键值作为基准值。比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的)。一般选择序列的第一个元素。
一次循环:从后往前比较,用基准值和最后一个值比较,如果比基准值小的交换位置,如果没有继续比较下一个,直到找到第一个比基准值小的值才交换。找到这个值之后,又从前往后开始比较,如果有比基准值大的,交换位置,如果没有继续比较下一个,直到找到第一个比基准值大的值才交换。直到从前往后的比较索引>从后往前比较的索引,结束第一次循环,此时,对于基准值来说,左右两边就是有序的了。
2.思路
(1) 首先在数组中选择一个基准点pivot(一般以数组第一个元素pivot,pivot= arr[i],此时数组i位置的值arr[i]可以覆盖)
(2)从数组右端开始扫面数组(i=low, j=high),比pivot大的排在右边(不做操作),继续扫描(j–)
(3)从右边扫描到比pivot小的, 覆盖位置为i的值(arr[i]=arr[j],第1步知数组i位置的值arr[i]可以覆盖), 从左边开始扫描
(4)从数组左端开始扫面数组,比pivot小的排在左边(不做操作),继续扫描(i++)
(5)从左边扫描到比pivot大的,覆盖位置为j的值(arr[j]=arr[i],第3步知数组j位置的值arr[j]可以覆盖)
(6)一直重复执行以上操作2-5直至i=j,将最终pivot的值赋给arr[i]
(7)对最终pivot所在位置左边子数组和右边字数组递归执行以上操作1-6
3.代码
/**
* 方法名:QuickSort
* 详述:快速排序 从小到大排序
* 核心思想:定义一个支撑点pivotkey(一般以数组第一个为pivot),小于的排左边,大于的排右边
*
*/
public static void QuickSort(int numbers[], int low, int high){
int i = low;
int j = high;
int pivot = numbers[i];
do{
while((numbers[j]>=pivot) && (j>i))
j--;
numbers[i] = numbers[j];
while((numbers[i]<=pivot) && (i<j))
i++;
numbers[j] = numbers[i];
}while(i<j);
numbers[i] = pivot;
if(i>low) QuickSort(numbers, low, i-1);
if(i<high) QuickSort(numbers, i+1, high);
}
测试:
@Test
public void testQuickSort(){
int[] numbers = {1,3,10,5,18,9,10,2,6,8,7};
AllSorts.QuickSort(numbers,0,10);
AllSorts.printArr(numbers);
}
结果:
1 2 3 5 6 7 8 9 10 10 18
4.优缺点
快速排序在序列中元素很少时,效率将比较低,不然插入排序,因此一般在序列中元素很少时使用插入排序,这样可以提高整体效率。