一、直接插入排序
二、希尔排序
三、冒泡排序
四、快速排序
五、简单选择排序
六、堆排序
七、归并排序
八、基数排序
九、计数排序
十、桶排序
一、直接插入排序
【算法思想】
【代码】
public void insertSort(int[] nums){
int len = nums.length; //len=10
for(int i=1;i<len;i++){
//每次排第i个元素。
int tmp = nums[i]; //第i趟排序就是把nums[i]插进来。
int j=i;
while(j>0 && nums[j-1]>tmp){
nums[j] = nums[j-1];
j--;
}
nums[j] = tmp;
}
}
时间复杂度:最好:o(n) 最坏:o(n2) 平均:o(n2)
稳定排序。
二、希尔排序
【算法思想】
我们选择增量gap=len/2,缩小增量继续以gap = gap/2的方式,这种增量选择我们可以用一个序列来表示,{n/2,(n/2)/2…1},称为增量序列。希尔排序的增量序列的选择与证明是个数学难题,我们选择的这个增量序列是比较常用的,也是希尔建议的增量,称为希尔增量,但其实这个增量序列不是最优的。
【代码】
public void shellSort(int[] nums){
int len = nums.length;
for(int gap = len/2; gap>=1; gap /= 2){
//增量gap
for(int i=gap; i<len ;i++){
//i++而不是i+=gap。
int tmp = nums[i];
int j=i;
while(j>=gap && nums[j-gap]>tmp){
nums[j] = nums[j-gap];
j -= gap;
}
nums[j] = tmp;
}
}
}
希尔排序的时间复杂度依赖于增量序列的函数,涉及到数学上尚未解决的难题。当n在某个特定范围时,希尔排序的时间复杂度约为o(n1.3)。最坏情况下为o(n2)。
三、冒泡排序
【算法思想】
【代码】
public void bubbleSort(int[] nums){
int len = nums.length; //len=10
for(int i=0;i<len-1;i++){
//只需要9趟排序。i范围:0~8
for(int j=0;j<len-i-1;j++){
//第4趟排序,i=3,已经有3个元素排好。只需排len-3个元素:0~6。j范围:0~5
if(nums[j] > nums[j+1]){
int tmp = nums[j];nums[j] = nums[j+1];nums[j+1] = tmp; //交换
}
}
}
}
改进:
public void bubbleSort(int[] nums){
int len = nums.length; //len=10
boolean flag;
for(int i=0;i<len-1;i++){
//只需要9趟排序。i范围:0~8
flag = false;
for(int j=0;j<len-i-1;j++)