最近在学习Comparable和Comparator 的区别,在学习的过程中发现,如果单从表明现象来理解这两个东西是比较难以理解的。于是写了两个Demo,一步一步的查看这两个种的内部实现原理,其实绕来绕去都是使用TimSort 对一个数组进行排序。
TimSort就是二分插入排序和优化版的归并排序的结合体。当数组元素数量小于某个值时,采用二分插入排序时间复杂度为O(N*lgN),当数据大的时候采...
分类:
其他好文 时间:
2014-12-05 12:49:31
阅读次数:
165
算法思想
从小到大排序
N1:遍历数组 array[10000], i 为数组坐标,从1开始
N2:以 i 为基数 tmpV=array[i],[0 ,i-1] 为区间坐标,(0+i-1)/2 为 mid 坐标
N3:比较 tmpV 与 array[mid],如果大于,则区间为 [mid+1,i-1],否则为[0,mid-1]
N4:遍历所有 i 实现以上递归步骤,直到 右坐标l...
分类:
其他好文 时间:
2014-09-09 12:36:48
阅读次数:
201
经典的排序算法有十种,分别是:选择排序、插入排序、希尔排序、冒泡排序、堆排序、合并排序、快速排序、计数排序、基数排序和桶排序。
下面对这些算法分类如下:
选择排序:简单选择排序、堆排序
插入排序:直接插入排序、二分插入排序、希尔排序
快速排序:快速排序、随机化快速排序
线性时间排序:计数排序、基数排序、桶排序
其他:冒泡排序、合并排序
这些排序排序算法的时间复杂度,稳...
分类:
其他好文 时间:
2014-08-20 16:31:32
阅读次数:
185
插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。
一、直接插入排序...
分类:
其他好文 时间:
2014-08-17 09:12:02
阅读次数:
211
之间介绍插入排序时漏掉一种插入方式,那就是折半插入。
这种方式是采用二分查找法去查找插入点,可以减少元素比较次数,但是并不能减少移动次数,复杂度跟直接插入一样,都为O(n^2).
直接上代码:
//二分插入排序
void binary_insert_sort(int arr[],int len)
{
if(arr == NULL || len <= 1)
{
return;
}...
分类:
其他好文 时间:
2014-07-28 00:27:19
阅读次数:
292
一、直接插入排序
稳定,时间复杂度:最好O(n)、最差O(n^2)、平均O(n^2),空间复杂度O(1)
void InsertSort(int L[], int n)
{
int i, j,key;
for (i = 1; i<n; i++)
if(L[i] < L[i-1])//需要将L[i]插入到有序表L[0...i-1]
{
key = L[i];...
分类:
其他好文 时间:
2014-07-08 13:40:33
阅读次数:
137
二分插入排序 也称折半插入排序,
1、基本思想:设数列[0....n]分为两部分一部分是[0...i]为有序序列,另一部分是[i+1.....n]为无序序列,从无序序列中取一个数
x ,利用二分查找算法找到 x 在有序序列中的插入位置并插入,有序序列还是有序的,接下来重复上述步骤,直到无序序列全部插入有序序列 ,这是整个序列只剩下有序序列即有序了。
2、代码:
{...
分类:
其他好文 时间:
2014-06-22 22:33:03
阅读次数:
187
插入排序
包括:直接插入排序,二分插入排序(又称折半插入排序),链表插入排序,希尔排序(又称缩小增量排序)。属于稳定排序的一种(通俗地讲,就是两个相等的数不会交换位置)
。
直接插入排序:
1、算法的伪代码(这样便于理解):
INSERTION-SORT (A, n) A[1 . . n]
for...
分类:
其他好文 时间:
2014-06-22 22:23:22
阅读次数:
218