纯粹个人的笔记,看到hadoop中的quickSort和headSort,发现原来的好东西都付之东流了,在此记一下下
------------------------------------
前几种,冒泡,标记都不适合实际使用,或是只用在部分排序上
堆排序实质是将树变为符合规则的大/小顶树,循环从下向上,递归从顶到下进行交换;建堆和排序两个过程都是在进行此操作
冒泡
一种实现可以:for 向后 for 内部向前
for(out = nElens-1;out>0;out--)
for(int i=0;i<out;i++)
if(a[i]>a[out])swap();
--------------------------------------
选择 冒泡的变形,使用标志,而不是替换,在内部结束时进行替换
一种实现可以:for 向前 for 内部向前
for(out=0;n<nElens-1;out++)
min = out;
for(int i=0;i<n;i++)
if(a[min]>a[i])min = i;
swap()
--------------------------------------
插入 跟前边有序列比较,找到合适的位置,进行错位
for(int out = 1; n< nElens; out++)
item = a[out];
int in = out;
while(in > 0 && a[in] > item)
a[out] = a[out-1];in--;
a[in] = item;
--------------------------------------
希尔 插入排序的改变,先进行分组,组内进行插入排序,知道分组数为1为止
int j;
for(int gap = data.length / 2; gap > 0; gap /= 2){
for(int i = gap; i < data.length; i++){
Comparable temp = data[i];
for(j = i; j >= gap && temp.compareTo(data[j - gap]) < 0; j -= gap){
data[j] = data[j - gap];
}
data[j] = temp;
}
}
--------------------------------------
转: http://blog.csdn.net/forrestgtju/article/details/7848829
快速 分区,递归在分区,每次分区确定一个基数位置,并将队列分两半
分区算法的一种实现:设left为基数位置,想跟right比较,再跟left比较,当left>=right,结束,并将基数放在left上int AdjustArray(int s[], int l, int r) //返回调整后基准数的位置
{
int i = l, j = r;
int x = s[l]; //s[l]即s[i]就是第一个坑
while (i < j)
{
// 从右向左找小于x的数来填s[i]
while(i < j && s[j] >= x)
j--;
if(i < j)
{
s[i] = s[j]; //将s[j]填到s[i]中,s[j]就形成了一个新的坑
i++;
}
// 从左向右找大于或等于x的数来填s[j]
while(i < j && s[i] < x)
i++;
if(i < j)
{
s[j] = s[i]; //将s[i]填到s[j]中,s[i]就形成了一个新的坑
j--;
}
}
//退出时,i等于j。将x填到这个坑中。
s[i] = x;
return i;
}
另一种实现快速排序,其实理论上都一样:
int left = i;
int right =j;
int temp = 0;
boolean r_or_l = true;
if(left>=right){
return;
}
while(left<right){
if(nums[left]>nums[right]){
temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
r_or_l = r_or_l?false:true;
}
if(r_or_l){
right--;
} else {
left++;
}
}
left-=1;
right+=1;
System.out.println(right+" "+left);
quickSort(nums, 0, left);
quickSort(nums, right, j);
最后在贴一版hadoop中实现的quickSort(他好像还想用堆排序,最后给give up了,不太清楚是没写完,还是写坏了)
private static void sortInternal(final IndexedSortable s, int p, int r,
final Progressable rep, int depth) {
if (null != rep) {
rep.progress();
}
while (true) {
if (r-p < 13) {
for (int i = p; i < r; ++i) {
for (int j = i; j > p && s.compare(j-1, j) > 0; --j) {
s.swap(j, j-1);
}
}
return;
}
if (--depth < 0) {
// give up
alt.sort(s, p, r, rep);
return;
}
// select, move pivot into first position
fix(s, (p+r) >>> 1, p);
fix(s, (p+r) >>> 1, r - 1);
fix(s, p, r-1);
// Divide
int i = p;
int j = r;
int ll = p;
int rr = r;
int cr;
while(true) {
while (++i < j) {
if ((cr = s.compare(i, p)) > 0) break;
if (0 == cr && ++ll != i) {
s.swap(ll, i);
}
}
while (--j > i) {
if ((cr = s.compare(p, j)) > 0) break;
if (0 == cr && --rr != j) {
s.swap(rr, j);
}
}
if (i < j) s.swap(i, j);
else break;
}
j = i;
// swap pivot- and all eq values- into position
while (ll >= p) {
s.swap(ll--, --i);
}
while (rr < r) {
s.swap(rr++, j++);
}
// Conquer
// Recurse on smaller interval first to keep stack shallow
assert i != j;
if (i - p < r - j) {
sortInternal(s, p, i, rep, depth);
p = j;
} else {
sortInternal(s, j, r, rep, depth);
r = i;
}
}
}
--------------------------------------
堆排序
堆排序 获得最大或最小元素,即为根元素;移除根元素,将最底元素移动至根位置。
重组树(移动新节点,最大根数要与最大子节点交换位置,反之亦然),然后递归
void HeapSort(SeqIAst R)
{ //对R[1..n]进行堆排序,不妨用R[0]做暂存单元
int i;
BuildHeap(R); //将R[1-n]建成初始堆
for(i=n;i>1;i--){ //对当前无序区R[1..i]进行堆排序,共做n-1趟。
R[0]=R[1];R[1]=R[i];R[i]=R[0]; //将堆顶和堆中最后一个记录交换
Heapify(R,1,i-1); //将R[1..i-1]重新调整为堆,仅有R[1]可能违反堆性质
} //endfor
} //HeapSort
--------------------------------------
基数排序 (出自java算法和数据结构)
基数排序 是把关键字拆分 然后进行排序。一般从各位开始,按照各位分10组,从0到9。以此遍历各个位,并且以后的分组内部顺序要满足上边的顺序。输出结果可显示为:
421 240 035 532 305 430 124
(240 430) (421) (532) (124) (035 305)
(305) (421 124) (430 532 035) (240)
(035) (124) (240) (305) (421 430) (532)
---------------------------------------------------------
加个折半查找,呵呵
int i = (low+high)/2
if(item=a[i]) re i;
if(item>a[i])
re find(a,i,high)
else
re find(a,low,i)
------------------
while(low<high)
int i = (low+high)/2
if(item = a[i])
break;
if(item>a[i])
low = i;
else
high = 1;