排序算法
常用的排序算法
- 冒泡排序
- 快速排序
- 堆排序
- 计数排序
- 桶排序
排序算法根据稳定性,可以划分为稳定排序和不稳定排序
如果值相同的元素在排序后仍然保持着排序前的顺序,则这样的排序算法是稳定排序,反之是不稳定排序
冒泡排序
public static void sort(int array[])
{
for(int i = 0,i a < array.length - 1, i ++)
{
for(int j = 0, j < array.length - i - 1, j ++)
{
int tmp = 0;
if(array[j] > array[i])
{
tmp = array[j];
array[j] = array[i];
array[i] = tmp;
}
}
}
}
优化版本1:
假设正常情况下需要7轮完成所有元素的比较排序,但是有可能在进行到第4轮时各元素就已经完成了排序,后3轮没有必要进行
public static void sort(int array[])
{
for(int i = 0,i a < array.length - 1, i ++)
{
boolean isSorted = true;
for(int j = 0, j < array.length - i - 1, j ++)
{
int tmp = 0;
if(array[j] > array[i])
{
tmp = array[j];
array[j] = array[i];
array[i] = tmp;
isSorted = false;
}
}
if(isSorted)
{
break;
}
}
}
优化版本2:
在每一轮排序后,记录最后一次元素交换的位置,该位置即为无序数列的边界,往后的元素都已经是有序的了,无需再交换
public static void sort(int array[])
{
int lastExchangeIndex = 0;
int sortBorder = array.length -1;
for(int i = 0,i a < array.length - 1, i ++)
{
boolean isSorted = true;
for(int j = 0, j < sortBorder, j ++)
{
int tmp = 0;
if(array[j] > array[i])
{
tmp = array[j];
array[j] = array[i];
array[i] = tmp;
isSorted = false;
lastExchangeIndex = j;
}
}
sortBorder = lastExchangeIndex;
if(isSorted)
{
break;
}
}
}
优化版本3:
鸡尾酒排序
冒泡排序的变形,第一轮从左到右比较,第二轮从右到左比较,以此类推
public static void sort(int array[])
{
int tmp = 0;
for(int i = 0,i < array.length / 2, i ++)
{
//奇数轮,从左到右比较
boolean isSorted = true;
for(int j = 0, j < array.length - i - 1, j ++)
{
if(array[j] > array[j + 1])
{
tmp = array[j];
array[j] = array[j + 1];
array[i] = tmp;
isSorted = false;
}
}
if(isSorted)
{
break;
}
//偶数轮,从右到左比较
isSorted = true;
for(int j = array.length - j - 1;j > i; j ++)
{
if(array[j] < array[j - 1])
{
tmp = array[j];
array[j] = array[j - 1]
array[j - 1] = tmp;
isSorted = false;
}
}
if(isSorted)
{
break;
}
}
}