排序

来源:互联网 发布:类似梦梦奈的软件 编辑:程序博客网 时间:2024/05/22 17:01
1.插入排序
每步将一个带排序的记录,按其关键字值的大小插入前面已经排序的文件中适当的位置上,直到全部插入完为止。
(1)直接插入排序
    把待排序的记录按其关键字的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。
(2)希尔排序(shell排序)
    假设有n个数字,选定第一个增量d1=n/2,把全部记录按此值从第一个记录起进行分组,所有相距为d1的记录作为一组,先在各组内进行插入排序,然后减小间距d2=d1/2,知道dn=1位置。

算法实现如下:
package
com.bocloud.sort;

/**
 * 数据类型
 *
 *@authordongkai
 *
 */
publicclass
Redtype {

intkey;// 关键字域

Object
data;// 其他域


public
Redtype() {

}

publicRedtype(intkey, Objectdata
) {
super
();
this.key=key
;
this.data=data
;
}

/**
*@returnthe key
*/publicint
getKey() {
returnkey
;
}

/**
*@paramkey
*            the key to set
*/publicvoidsetKey(intkey
) {
this.key=key
;
}

/**
*@returnthe data
*/public
Object getData() {
returndata
;
}

/**
*@paramdata
*            the data to set
*/publicvoidsetData(Objectdata
) {
this.data=data
;
}

}
package
com.bocloud.sort;

/**
 * 插入排序
 *
 *@authordongkai
 *
 */
publicclass
InsertTest {

/**
* 直接插入排序
*
*@paramr
*@paramn
*/publicvoidzjInsert(Redtyper[],intn
) {
intj
;
Redtype
temp
;
for(inti= 1; i < n; i
++) {
temp=r[i
];
j=i
- 1;
while(j> -1 && temp.key<r[j].key
) {
r[j+ 1] = r[j
];
j
--;
}
r[j+ 1] = temp
;
}
}

/**
* 希尔排序
*
*@paramr
*@paramn
*/publicvoidslpx(Redtyper[],intn
) {
Redtype
x
;
inti,j,d
;
d=n
/ 2;
while(d>= 1) {// 以各种不同的间隔距离d进行排序for(i=d;i< n; i++) {// 在某个d值下对各组进行排序x=r[i
];
j=i- d
;
while((j>= 0) && (x.key<r[j].key)) {// 按某个d值为间隔进行组内比较r[j+d] =r[j
];
j=j- d
;
}
r[j+d] =x
;
}
d=d
/ 2;
}
}
}
2.交换排序
两两比较待排序中的关键值,交换不满足顺序的那些偶对,直到全部满足为止。
(1)冒泡排序
    先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则交换2条记录;然后比较第二个记录和第三个记录,直到比较完位置。对含有n个记录的文件最多需要进行n-1趟冒泡排序。
(2)快速排序
    记录的比较和交换从两端向中间进行,关键字较小和较大的记录一次就能换到前面或者后面。就是把第一个数字和第二个数字比较,逆序则交换。

算法实现如下:
package
com.bocloud.sort;

/**
 * 交换排序
 *
 *@authordongkai
 *
 */
publicclass
SwitchTest {

/**
* 冒泡排序
*
*@paramr
*@paramn
*/publicvoidmppx(Redtyper[],intn
) {
inti= 1,k
= 1;
Redtype
x
;
while(i<n&& k
> 0) {
k
= 0;
for(intj= 0; j < n - i; j
++) {
if(r[j+ 1].key<r[j].key
) {
k
++;
x=r[j
];
r[j] = r[j
+ 1];
r[j+ 1] = x
;
}
}
i
++;
}
}

/**
* 快速排序
*
*@paramr
*@paramt
*@paramw
*/publicvoidkspx(Redtyper[],intt,intw
) {
inti,j
;
Redtype
x
;
if(t<w
) {
i=t
;
j=w
;
x=r[i
];
while(i<j
) {
while(r[j].key>=x.key&&j> i
) {
j
--;
}
if(i<j
) {
r[i] = r[j
];
i
++;
}
while(r[i].key<=x.key&&j> i
) {
i
++;
}
if(i<j
) {
r[j] = r[i
];
j
--;
}
}
r[i] = x
;
kspx(
r,t,j
- 1);
kspx(
r,j+ 1, w
);
}
}

}
0 0
原创粉丝点击