介绍两种交换排序:冒泡和交换
冒泡排序算法的原理如下:
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
冒泡排序的时间复杂度为
,并且是一种稳定的排序。
public static void bubbleSort(int[] numbers)
{
int temp = 0;
int size = numbers.length;
for(int i = 0 ; i < size-1; i ++)
{
for(int j = 0 ;j < size-1-i ; j++)
{
if(numbers[j] > numbers[j+1]) //交换两数位置
{
temp = numbers[j];
numbers[j] = numbers[j+1];
numbers[j+1] = temp;
}
}
}
}
交换排序:快速排序由C. A. R. Hoare在1962年提出的一种划分交换排序。它采用了一种分治的策略通常称为分治法。分治法的基本思想是将原问题分解为若干个规模更小的但结构与原问题相似的子问题,然后递归的解决这些子问题,之后将子问题的解组合为原问题的解。因此在用递归描述的分治算法的每一层递归上,都有以上三个步骤。
快速排序的主要步骤如下:
1) 设置两个变量i、j,排序开始的时候:i=0,j=n-1;
2)第一个数组值作为比较值,首先保存到temp中,即temp=A[0];
3)然后j-- ,向前搜索,找到小于temp后,因为s[i]的值保存在temp中,所以直接赋值,s[i]=s[j]
4)然后i++,向后搜索,找到大于temp后,因为s[j]的值保存在第2步的s[i]中,所以直接赋值,s[j]=s[i],然后j--,避免死循环
5)重复第3、4步,直到i=j,最后将temp值返回s[i]中
6) 然后采用“二分”的思想,以i为分界线,拆分成两个数组 s[0,i-1]、s[i+1,n-1]又开始排序。
public static int getMiddle(int[] list, int low, int high){
int tmp = list[low];//数组的第一个作为中轴
while (low < high){
while (low < high && list[high] >= tmp){
high--;
}
list[low] = list[high];//比中轴小的记录移到低端
while (low < high && list[low] <= tmp){
low++;
}
list[high] = list[low];//比中轴大的记录移到高端
}
list[low] = tmp;//中轴记录到尾
return low;//返回中轴的位置
}
public static void _quickSort(int[] list, int low, int high){
if (low < high){
int middle = getMiddle(list, low, high);//将list数组进行一分为二
_quickSort(list, low, middle - 1);//对低字表进行递归排序
_quickSort(list, middle + 1, high);//对高字表进行递归排序
}
}