- 浏览: 958383 次
- 性别:
- 来自: 魔都
文章分类
- 全部博客 (745)
- MultiThread (19)
- My Plan (118)
- JavaBasic (61)
- MyInterview (104)
- InternetTechnique (5)
- ProjectConclusion (1)
- Maven (5)
- MogoDb (5)
- Hadoop (11)
- Memcached (6)
- TechniqueCollect (1)
- Ibaits (1)
- Android (34)
- ItLife (40)
- Tree (2)
- ProjectArchitect (7)
- Open Source (3)
- liunx (5)
- socket (8)
- Spring (27)
- DesginPattern (35)
- WebBasic (13)
- English (13)
- structs (1)
- structs2 (2)
- Oracle (17)
- Hibernate (2)
- JavaScript (4)
- Jdbc (1)
- Jvm (15)
- Ibatis (1)
- DataStructures (13)
- Https/Socket/Tcp/Ip (3)
- Linux (4)
- Webservice (7)
- Io (2)
- Svn (1)
- Css (1)
- Ajax (1)
- ExtJs (1)
- UML (2)
- DataBase (6)
- BankTechnique (3)
- SpringMvc (3)
- Nio (3)
- Load Balancing/Cluster (3)
- Tools (1)
- javaPerformanceOptimization (8)
- Lucene(SEO) (1)
- My Think (80)
- NodeJs (1)
- Quartz (1)
- Distributed-java (1)
- MySql (7)
- Project (4)
- junit (4)
- framework (1)
- enCache (1)
- git (2)
- SCJP (1)
- sd (1)
最新评论
-
lkjxshi:
你都这水平了还考这个证干嘛
SCJP 认证考试指南 -
钟逸华:
问的真多
百度java开发面试题(转) -
zuimeitulip:
觉得我就是这样的,从小阅读量就很少,导致现在的读的速度非常慢, ...
让读书成为一种习惯 -
DDT_123456:
我觉得你是不符合要求。问你hashmap的那个问题,你那样回答 ...
阿里面试2(转) -
jingjing0907:
刚刚写了很多读过此博客的感受,竟然没有发上去,以为我注册账号还 ...
让读书成为一种习惯
排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序
- 博客分类:
- DataStructures
先推荐一篇关于排序算法的文章:http://www.cppblog.com/guogangj/archive/2009/11/13/100876.html
http://yiyickf.iteye.com/blog/1047010
本文思路部分来源于上篇文章,但测得的结果似乎不大相同,不知是因为java的缘故还是因为我算法的缘故,欢迎拍砖。
复习排序,顺便比下各种算法的速度,榜单如下:
1、冒泡排序
2、简单选择排序
3、直接插入排序
4、折半插入排序
5、希尔排序
6、堆排序
7、归并排序
8、快速排序
当然这是慢速排行,哈哈~~
直接上图:单位毫秒
数量
冒泡排序
简单选择排序
直接插入排序
折半插入排序
希尔排序
堆排序
归并排序
快速排序
10000个
1578
1250
672
250
0
15
16
0
15000个
3453
2765
1563
531
16
15
16
0
20000个
6140
4547
2453
828
16
16
15
16
25000个
10079
7171
3969
1313
31
16
15
16
30000个
14641
10313
5578
1906
31
31
16
31
35000个
20141
14328
7890
2563
31
31
32
15
40000个
25766
18359
10094
3422
47
31
31
32
45000个
32469
24063
13062
4359
47
47
31
47
由于"希尔排序","堆排序","归并排序","快速排序"太快,以至于在上图几乎是条直线,故有了下面转为他们准备的加强版
数量
希尔排序
堆排序
归并排序
快速排序
100000个
172
140
110
93
200000个
469
406
235
234
300000个
812
703
422
375
400000个
1125
1031
516
531
500000个
1406
1282
719
656
600000个
1828
1703
860
859
700000个
2531
2063
1000
968
800000个
2735
2453
1140
1188
900000个
3047
2843
1391
1266
1000000个
3375
3187
1516
1422
1100000个
3922
3500
1625
1609
1200000个
4421
3954
1969
1812
1300000个
4797
4422
2000
1953
1400000个
5391
4797
2547
2094
1500000个
5437
5219
2625
2328
1600000个
6203
5546
2469
2485
1700000个
6532
5953
2844
2672
1800000个
7125
6421
2984
2844
补上代码:
Java代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 插入排序:直接插入排序、折半插入排序和系尔排序
* 交换排序:冒泡排序和快速排序
* 选择排序:简单选择排序和堆排序
* 归并排序:归并排序
*
* 基本思想
* 插入排序:将第N个记录插入到前面(N-1)个有序的记录当中。
* 交换排序:按照某种顺序比较两个记录的关键字大小,然后根据需要交换两个记录的位置。
* 选择排序:根据某种方法选择一个关键字最大的记录或者关键字最小的记录,放到适当的位置。
*
* 排序方法比较
* 排序方法 平均时间 最坏时间 辅助存储
* 直接插入排序 O(N2) O(N2) O(1)
* 起泡排序 O(N2) O(N2) O(1)
* 快速排序 O(Nlog2N) O(N2) O(Nlog2N)
* 简单选择排序 O(N2) O(N2) O(1)
* 堆排序 O(Nlog2N) O(Nlog2N) O(1)
* 归并排序 O(Nlog2N) O(Nlog2N) O(n)
* 基数排序 O(d(n+radix)) O(d(n+radix)) O(radix)
*
*
*
* @author Administrator
*
*/
public class SortTest {
public static void main(String[] args)throws Exception {
//测试排序是否正确
//String[] testErr=new String[]{"冒泡排序","简单选择排序","直接插入排序","折半插入排序","系尔排序","堆排序","归并排序","快速排序"};
//new SortTest().testErr(testErr);
//排序1(全部)
String[] strs=new String[]{"冒泡排序","简单选择排序","直接插入排序","折半插入排序","希尔排序","堆排序","归并排序","快速排序"};
new SortTest().test(strs,10000,50000,5000);
//排序2(加强)
String[] strs2=new String[]{"希尔排序","堆排序","归并排序","快速排序"};
new SortTest().test(strs2,100000,1900000,100000);
}
private void testErr(String[] strings) throws Exception{
//System.out.println(Arrays.toString(old));
System.out.println(Arrays.toString(strings));
Number[] old=getRundom(50);
Integer[] oo={1,2,3,3,2,21,5,6,7,78,5,65,8,7,6,6,6,6,6,9,56544,354,32,4,456,8,89,-9,0,3,243,-321,321,-3,-2,21};
old=oo;
for(String s:strings){
Number[] testNum=Arrays.copyOf(old, old.length);
long begin=System.currentTimeMillis();
SortTest.class.getMethod(s, Number[].class).invoke(this, (Object)testNum);
long end=System.currentTimeMillis();
System.out.println(s+":"+(end-begin)+"\t");
System.out.println(Arrays.toString(testNum));
}
System.out.println();
}
private void test(String[] strings,long begin,long end,long step) throws Exception{
System.out.print("数量\t");
for(String str:strings){
System.out.print(str+"\t");
}
System.out.println();
for(long i=begin;i<end;i=i+step){
System.out.print(i+"个\t");
Number[] old=getRundom(i);
for(String s:strings){
Number[] testNum=Arrays.copyOf(old, old.length);
long beginTime=System.currentTimeMillis();
SortTest.class.getMethod(s, Number[].class).invoke(this, (Object)testNum);
long endTime=System.currentTimeMillis();
System.out.print((endTime-beginTime)+"\t");
//System.out.println(Arrays.toString(testNum));
}
System.out.println();
}
}
private static Integer[] getRundom(long num) {
List<Integer> list=new ArrayList<Integer>();
for(long i=0;i<num;i++){
int k;
if(Math.random()>0.5){
k=(int)(Math.random()*Integer.MAX_VALUE);
}else{
k=(int)(Math.random()*Integer.MIN_VALUE);
}
list.add(k);
}
return list.toArray(new Integer[list.size()]);
}
/**
* 插入排序————直接插入排序
* @param data
*/
public static void 直接插入排序(Number[] data)
{
Number tmp=null ;
for(int i=1;i<data.length;i++){
tmp = data[i];
int j=i-1;
while(j>=0 && tmp.doubleValue()<data[j].doubleValue()){
data[j+1]=data[j];
j--;
}
data[j+1]=tmp;
}
}
/**
* 插入排序————折半插入排序
* @param data
*/
public static void 折半插入排序(Number[] data)
{
Number tmp=null ;
for(int i=1;i<data.length;i++){
tmp = data[i];
int smallpoint=0;
int bigpoint=i-1;
while(bigpoint>=smallpoint){
int mid=(smallpoint+bigpoint)/2;
if(tmp.doubleValue()>data[mid].doubleValue()){
smallpoint=mid+1;
}else{
bigpoint=mid-1;
}
}
for(int j=i;j>smallpoint;j--){
data[j]=data[j-1];
}
data[bigpoint+1]=tmp;
}
}
/**
* 插入排序————希尔排序
* @param data
*/
public static void 希尔排序(Number[] data)
{
int span=data.length/7;
if(span==0)span=1;
while(span>=1){
for(int i=0;i<span;i++){
for(int j=i;j<data.length;j=j+span){
//组内直接插入排序
int p = j-span;
Number temp = data[j];
while( p >=0 && data[p].doubleValue() > temp.doubleValue()){
data[p+span] = data[p];
p -=span;
}
data[p + span] = temp;
}
}
span=span/2;
}
}
/**
* 交换排序————冒泡排序
*
* @param data
*/
public static void 冒泡排序(Number[] data)
{
for (int i = 0; i < data.length; i++) {
//将相邻两个数进行比较,较大的数往后冒泡
for (int j = 0; j < data.length - i-1; j++) {
if (data[j].doubleValue()> data[j + 1].doubleValue()) {
//交换相邻两个数
swap(data, j, j + 1);
}
}
}
}
/**
* 交换排序————快速排序
* @param data
*/
public static void 快速排序(Number[] data)
{
QuickSort(data,0,data.length-1);
}
private static void QuickSort(Number[] data, int begin, int end) {
// System.out.println(begin+":"+end);
if(begin<end){
//取中点
int mid=(begin+end)/2;
if(data[end].doubleValue()<data[begin].doubleValue()){
swap(data, end, begin);
}
if(data[end].doubleValue()<data[mid].doubleValue()){
swap(data, end, mid);
}
if(data[mid].doubleValue()<data[begin].doubleValue()){
swap(data, mid, begin);
}
swap(data, mid, begin);
// System.out.println(Arrays.toString(Arrays.copyOfRange(data, begin, end)) );
int min=begin+1;
int big=end;
while(true){
while(min<big && data[min].doubleValue()<data[begin].doubleValue()){min++;}
while(min<big && data[big].doubleValue()>=data[begin].doubleValue()){big--;}
if(min>=big){
break;
}
swap(data, min, big);
}
if(data[begin].doubleValue()>data[min].doubleValue()){
swap(data, begin, min);
}
if(min>1)
QuickSort(data,begin,min-1);
//if(min<end)
QuickSort(data,min,end);
}
}
/**
* 选择排序————简单选择排序
* @param data
*/
public static void 简单选择排序(Number[] data)
{
for (int i = 0; i < data.length-1; i++) {
int smallPoint=i;
for (int j = i+1; j < data.length; j++) {
if (data[smallPoint].doubleValue()> data[j].doubleValue()) {
smallPoint=j;
}
}
swap(data, i, smallPoint);
}
}
/**
* 选择排序————堆排序
* @param data
*/
public static void 堆排序(Number[] data)
{
int n = data.length;
for(int i=n/2;i>=0;i--){
keepHeap(data, n, i);
}
while (n > 0) {
swap(data, 0, n-1);
keepHeap(data, --n, 0);
}
}
private static void keepHeap(Number[] a, int n, int i) {
Number x = a[i];
int j = 2 * i + 1;
while (j <= n - 1) {
if (j < n - 1 && a[j].doubleValue() < a[j + 1].doubleValue())
++j;
if (a[j].doubleValue() > x.doubleValue()) {
a[i] = a[j];
i = j;
j = 2 * i ;
} else{
break;
}
}
a[i] = x;
}
/**
* 归并排序法————归并排序
* @param data
*/
public static void 归并排序(Number[] data)
{
Number[] result = merge_sort(data,0,data.length-1);
for(int i=0;i<result.length;i++){
data[i]=result[i];
}
}
private static Number[] merge_sort(Number[] array, int start, int end){
Number[] result = new Number[end-start+1];
if(start< end){
int mid= (start+end)/2;
Number[] left= merge_sort(array, start, mid);
Number[] right = merge_sort(array, mid+1, end);
result= merge(left,right);
} else if (start == end) {
result[0] = array[start];
return result;
}
return result;
}
private static Number[] merge(Number[] left, Number[] right) {
Number[] result = new Number[left.length+right.length];
int i=0;
int j=0;
int k=0;
while(i< left.length&&j< right.length){
if(left[i].doubleValue()< right[j].doubleValue()){
result[k++] = left[i++];
}else{
result[k++] = right[j++];
}
}
while(i< left.length){
result[k++] = left[i++];
}
while (j< right.length) {
result[k++]= right[j++];
}
return result;
}
/**
* 交换数组中指定的两元素的位置
* @param data
* @param x
* @param y
*/
private static void swap(Number[] data, int x, int y) {
Number temp = data[x];
data[x] = data[y];
data[y] = temp;
}
}
http://yiyickf.iteye.com/blog/1047010
本文思路部分来源于上篇文章,但测得的结果似乎不大相同,不知是因为java的缘故还是因为我算法的缘故,欢迎拍砖。
复习排序,顺便比下各种算法的速度,榜单如下:
1、冒泡排序
2、简单选择排序
3、直接插入排序
4、折半插入排序
5、希尔排序
6、堆排序
7、归并排序
8、快速排序
当然这是慢速排行,哈哈~~
直接上图:单位毫秒
数量
冒泡排序
简单选择排序
直接插入排序
折半插入排序
希尔排序
堆排序
归并排序
快速排序
10000个
1578
1250
672
250
0
15
16
0
15000个
3453
2765
1563
531
16
15
16
0
20000个
6140
4547
2453
828
16
16
15
16
25000个
10079
7171
3969
1313
31
16
15
16
30000个
14641
10313
5578
1906
31
31
16
31
35000个
20141
14328
7890
2563
31
31
32
15
40000个
25766
18359
10094
3422
47
31
31
32
45000个
32469
24063
13062
4359
47
47
31
47
由于"希尔排序","堆排序","归并排序","快速排序"太快,以至于在上图几乎是条直线,故有了下面转为他们准备的加强版
数量
希尔排序
堆排序
归并排序
快速排序
100000个
172
140
110
93
200000个
469
406
235
234
300000个
812
703
422
375
400000个
1125
1031
516
531
500000个
1406
1282
719
656
600000个
1828
1703
860
859
700000个
2531
2063
1000
968
800000个
2735
2453
1140
1188
900000个
3047
2843
1391
1266
1000000个
3375
3187
1516
1422
1100000个
3922
3500
1625
1609
1200000个
4421
3954
1969
1812
1300000个
4797
4422
2000
1953
1400000个
5391
4797
2547
2094
1500000个
5437
5219
2625
2328
1600000个
6203
5546
2469
2485
1700000个
6532
5953
2844
2672
1800000个
7125
6421
2984
2844
补上代码:
Java代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 插入排序:直接插入排序、折半插入排序和系尔排序
* 交换排序:冒泡排序和快速排序
* 选择排序:简单选择排序和堆排序
* 归并排序:归并排序
*
* 基本思想
* 插入排序:将第N个记录插入到前面(N-1)个有序的记录当中。
* 交换排序:按照某种顺序比较两个记录的关键字大小,然后根据需要交换两个记录的位置。
* 选择排序:根据某种方法选择一个关键字最大的记录或者关键字最小的记录,放到适当的位置。
*
* 排序方法比较
* 排序方法 平均时间 最坏时间 辅助存储
* 直接插入排序 O(N2) O(N2) O(1)
* 起泡排序 O(N2) O(N2) O(1)
* 快速排序 O(Nlog2N) O(N2) O(Nlog2N)
* 简单选择排序 O(N2) O(N2) O(1)
* 堆排序 O(Nlog2N) O(Nlog2N) O(1)
* 归并排序 O(Nlog2N) O(Nlog2N) O(n)
* 基数排序 O(d(n+radix)) O(d(n+radix)) O(radix)
*
*
*
* @author Administrator
*
*/
public class SortTest {
public static void main(String[] args)throws Exception {
//测试排序是否正确
//String[] testErr=new String[]{"冒泡排序","简单选择排序","直接插入排序","折半插入排序","系尔排序","堆排序","归并排序","快速排序"};
//new SortTest().testErr(testErr);
//排序1(全部)
String[] strs=new String[]{"冒泡排序","简单选择排序","直接插入排序","折半插入排序","希尔排序","堆排序","归并排序","快速排序"};
new SortTest().test(strs,10000,50000,5000);
//排序2(加强)
String[] strs2=new String[]{"希尔排序","堆排序","归并排序","快速排序"};
new SortTest().test(strs2,100000,1900000,100000);
}
private void testErr(String[] strings) throws Exception{
//System.out.println(Arrays.toString(old));
System.out.println(Arrays.toString(strings));
Number[] old=getRundom(50);
Integer[] oo={1,2,3,3,2,21,5,6,7,78,5,65,8,7,6,6,6,6,6,9,56544,354,32,4,456,8,89,-9,0,3,243,-321,321,-3,-2,21};
old=oo;
for(String s:strings){
Number[] testNum=Arrays.copyOf(old, old.length);
long begin=System.currentTimeMillis();
SortTest.class.getMethod(s, Number[].class).invoke(this, (Object)testNum);
long end=System.currentTimeMillis();
System.out.println(s+":"+(end-begin)+"\t");
System.out.println(Arrays.toString(testNum));
}
System.out.println();
}
private void test(String[] strings,long begin,long end,long step) throws Exception{
System.out.print("数量\t");
for(String str:strings){
System.out.print(str+"\t");
}
System.out.println();
for(long i=begin;i<end;i=i+step){
System.out.print(i+"个\t");
Number[] old=getRundom(i);
for(String s:strings){
Number[] testNum=Arrays.copyOf(old, old.length);
long beginTime=System.currentTimeMillis();
SortTest.class.getMethod(s, Number[].class).invoke(this, (Object)testNum);
long endTime=System.currentTimeMillis();
System.out.print((endTime-beginTime)+"\t");
//System.out.println(Arrays.toString(testNum));
}
System.out.println();
}
}
private static Integer[] getRundom(long num) {
List<Integer> list=new ArrayList<Integer>();
for(long i=0;i<num;i++){
int k;
if(Math.random()>0.5){
k=(int)(Math.random()*Integer.MAX_VALUE);
}else{
k=(int)(Math.random()*Integer.MIN_VALUE);
}
list.add(k);
}
return list.toArray(new Integer[list.size()]);
}
/**
* 插入排序————直接插入排序
* @param data
*/
public static void 直接插入排序(Number[] data)
{
Number tmp=null ;
for(int i=1;i<data.length;i++){
tmp = data[i];
int j=i-1;
while(j>=0 && tmp.doubleValue()<data[j].doubleValue()){
data[j+1]=data[j];
j--;
}
data[j+1]=tmp;
}
}
/**
* 插入排序————折半插入排序
* @param data
*/
public static void 折半插入排序(Number[] data)
{
Number tmp=null ;
for(int i=1;i<data.length;i++){
tmp = data[i];
int smallpoint=0;
int bigpoint=i-1;
while(bigpoint>=smallpoint){
int mid=(smallpoint+bigpoint)/2;
if(tmp.doubleValue()>data[mid].doubleValue()){
smallpoint=mid+1;
}else{
bigpoint=mid-1;
}
}
for(int j=i;j>smallpoint;j--){
data[j]=data[j-1];
}
data[bigpoint+1]=tmp;
}
}
/**
* 插入排序————希尔排序
* @param data
*/
public static void 希尔排序(Number[] data)
{
int span=data.length/7;
if(span==0)span=1;
while(span>=1){
for(int i=0;i<span;i++){
for(int j=i;j<data.length;j=j+span){
//组内直接插入排序
int p = j-span;
Number temp = data[j];
while( p >=0 && data[p].doubleValue() > temp.doubleValue()){
data[p+span] = data[p];
p -=span;
}
data[p + span] = temp;
}
}
span=span/2;
}
}
/**
* 交换排序————冒泡排序
*
* @param data
*/
public static void 冒泡排序(Number[] data)
{
for (int i = 0; i < data.length; i++) {
//将相邻两个数进行比较,较大的数往后冒泡
for (int j = 0; j < data.length - i-1; j++) {
if (data[j].doubleValue()> data[j + 1].doubleValue()) {
//交换相邻两个数
swap(data, j, j + 1);
}
}
}
}
/**
* 交换排序————快速排序
* @param data
*/
public static void 快速排序(Number[] data)
{
QuickSort(data,0,data.length-1);
}
private static void QuickSort(Number[] data, int begin, int end) {
// System.out.println(begin+":"+end);
if(begin<end){
//取中点
int mid=(begin+end)/2;
if(data[end].doubleValue()<data[begin].doubleValue()){
swap(data, end, begin);
}
if(data[end].doubleValue()<data[mid].doubleValue()){
swap(data, end, mid);
}
if(data[mid].doubleValue()<data[begin].doubleValue()){
swap(data, mid, begin);
}
swap(data, mid, begin);
// System.out.println(Arrays.toString(Arrays.copyOfRange(data, begin, end)) );
int min=begin+1;
int big=end;
while(true){
while(min<big && data[min].doubleValue()<data[begin].doubleValue()){min++;}
while(min<big && data[big].doubleValue()>=data[begin].doubleValue()){big--;}
if(min>=big){
break;
}
swap(data, min, big);
}
if(data[begin].doubleValue()>data[min].doubleValue()){
swap(data, begin, min);
}
if(min>1)
QuickSort(data,begin,min-1);
//if(min<end)
QuickSort(data,min,end);
}
}
/**
* 选择排序————简单选择排序
* @param data
*/
public static void 简单选择排序(Number[] data)
{
for (int i = 0; i < data.length-1; i++) {
int smallPoint=i;
for (int j = i+1; j < data.length; j++) {
if (data[smallPoint].doubleValue()> data[j].doubleValue()) {
smallPoint=j;
}
}
swap(data, i, smallPoint);
}
}
/**
* 选择排序————堆排序
* @param data
*/
public static void 堆排序(Number[] data)
{
int n = data.length;
for(int i=n/2;i>=0;i--){
keepHeap(data, n, i);
}
while (n > 0) {
swap(data, 0, n-1);
keepHeap(data, --n, 0);
}
}
private static void keepHeap(Number[] a, int n, int i) {
Number x = a[i];
int j = 2 * i + 1;
while (j <= n - 1) {
if (j < n - 1 && a[j].doubleValue() < a[j + 1].doubleValue())
++j;
if (a[j].doubleValue() > x.doubleValue()) {
a[i] = a[j];
i = j;
j = 2 * i ;
} else{
break;
}
}
a[i] = x;
}
/**
* 归并排序法————归并排序
* @param data
*/
public static void 归并排序(Number[] data)
{
Number[] result = merge_sort(data,0,data.length-1);
for(int i=0;i<result.length;i++){
data[i]=result[i];
}
}
private static Number[] merge_sort(Number[] array, int start, int end){
Number[] result = new Number[end-start+1];
if(start< end){
int mid= (start+end)/2;
Number[] left= merge_sort(array, start, mid);
Number[] right = merge_sort(array, mid+1, end);
result= merge(left,right);
} else if (start == end) {
result[0] = array[start];
return result;
}
return result;
}
private static Number[] merge(Number[] left, Number[] right) {
Number[] result = new Number[left.length+right.length];
int i=0;
int j=0;
int k=0;
while(i< left.length&&j< right.length){
if(left[i].doubleValue()< right[j].doubleValue()){
result[k++] = left[i++];
}else{
result[k++] = right[j++];
}
}
while(i< left.length){
result[k++] = left[i++];
}
while (j< right.length) {
result[k++]= right[j++];
}
return result;
}
/**
* 交换数组中指定的两元素的位置
* @param data
* @param x
* @param y
*/
private static void swap(Number[] data, int x, int y) {
Number temp = data[x];
data[x] = data[y];
data[y] = temp;
}
}
发表评论
-
java的8种排序
2013-03-19 22:51 956url:http://www.iteye.com/topic ... -
排序算法分析之冒泡排序
2012-05-25 11:27 1536冒泡排序(Bubble Sort)是一种简单的排序算法。它重复 ... -
想对集合说的一些话
2012-04-24 00:11 1009Java的集合很有用,自己看过很多了,但是总是感觉很模糊,用起 ... -
数据结构(c语言)
2012-04-19 21:29 11391. 经典算法 单链表:遍 ... -
java中数据结构二分查法
2012-04-20 00:19 1323数据结构和算法是一个程序的灵魂,优化程序的主要手段。在查询里, ... -
插入排序
2012-04-21 21:16 959插入排序无非就是在原来已经排好序的基础上再一个个添加元素,每次 ... -
java经典算法40题
2012-04-14 12:16 1701排序算法:http://www.cnblogs.com/mor ... -
数据结构与算法基础
2012-03-29 09:31 12201.arraylist(底层数组实现) ... -
2012/3/27----归并排序
2012-03-27 13:58 1005通过使用分治算法的思想来对数组进行排序(这里叫做归并排序),分 ... -
算法学习一之常见的七大排序算法
2012-03-19 09:40 1489算法之排序 十三个经典 ... -
深入arraylist,linkedlist,hashmap,hashset源码(2012/3/18)
2012-03-18 16:30 15631.冒泡排序 2.arraylist存 ... -
快速排序算法原理与实现/交换排序
2012-03-19 09:45 1515快速排序的大致思想为取到中间位置的元素,其他元素和其一一比较, ...
相关推荐
排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序.mht
本主题将详细探讨希尔排序、冒泡排序、堆排序等经典的排序算法,这些都是数据结构与算法学习中的核心内容,尤其对于北邮数据结构课程来说,理解并掌握这些排序方法至关重要。 1. **插入排序**: 插入排序是一种...
10种排序算法代码+综合比较代码(直接插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序、基数排序、折半插入排序、2路插入排序),其中不仅有各种排序算法的代码,还包含10种代码在关键字...
七种排序算法(包括直接插入排序,折半插入排序,希尔排序,冒泡排序,快速排序,简单选择排序,归并排序) 还有两道题 1./*设计并实现一个有效的对n个整数重排的算法,使得所有负数位于非负数之前,给出算法的性能...
这里我们详细探讨一下标题和描述中提到的几种排序算法:冒泡排序、选择排序、快速排序、归并排序、插入排序、折半插入排序、希尔排序以及堆排序。 1. **冒泡排序**:冒泡排序是一种简单的交换排序方法。它通过不断...
希尔排序是一种改进的插入排序,通过将待排序元素按一定间隔分组,对每组进行直接插入排序,然后逐渐减小间隔,直至间隔为1,完成排序。这种方法减少了元素的比较和移动次数,提高了效率。 **4. 快速排序(Quick ...
- **归并排序(Merge Sort)**:归并排序也是一种分治算法,它将数组拆分为两个子数组,分别进行排序,然后合并这两个已排序的子数组以得到最终结果。这种方法保证了稳定的排序效果。 - **桶排序(Bucket Sort)*...
折半插入排序是一种改进的插入排序,它通过二分查找找到合适的位置将元素插入,降低了比较的复杂度。其主要步骤包括:将数组分为已排序部分和未排序部分,然后逐个将未排序元素插入到已排序部分的正确位置。 2. **...
- **希尔排序**:改进的插入排序,通过增量序列对数据进行预排序,再进行直接插入排序,提高了效率。 - **堆排序**:通过构建堆结构,利用堆的性质进行排序,具有稳定的O(n log n)时间复杂度。 3. **C语言实现**...
在本文中,我们将深入探讨C++实现的八种常见的排序算法,它们分别是插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和LST基数排序。这些排序算法在计算机科学中有着广泛的应用,是理解和掌握...
根据给定的信息,本文将详细介绍数据结构中几种常见的排序算法:冒泡排序、直接插入排序、折半插入排序、希尔排序、快速排序、选择排序、二路递归排序(这里可能指的是二路归并排序)以及堆排序。这些排序算法在...
直接插入排序是一种简单的排序算法,它通过比较新元素与已排序序列中的元素,找到合适的位置将其插入。在最坏情况下,比较次数为n(n-1)/2,移动次数取决于数据的初始状态。 2. **折半插入排序**: 折半插入排序...
随机产生n个1~99的正整数序列,分别采用直接插入排序、折半插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序和二路归并排序对其进行递增排序
根据给定文件的信息,本文将详细介绍Java中的五种主要排序算法:插入排序、交换排序、选择排序、归并排序以及基数排序。每种排序方法都包括了不同的变体和技术细节。 ### 一、插入排序 #### 1. 直接插入排序 直接...
在这个数据结构报告中,我们将深入探讨七种不同的内排序算法:简单选择排序、冒泡排序、插入排序、快速排序、两路合并排序以及堆排序。这些排序算法在C++语言环境下进行了实现,并且包含了详细的源代码和实验报告,...
本主题将详细介绍六种经典的排序方法:折半插入排序、冒泡排序、快速排序、简单选择排序、归并排序和堆排序。这六种方法在不同的场景下各有优势,理解它们的工作原理对于优化算法性能和解决实际问题至关重要。 1. ...
- **希尔排序**:基于插入排序,通过增量序列分组,减少元素移动次数,提高了排序速度。 ### 2. 交换排序 - **冒泡排序**:通过相邻元素的反复交换,使最大(或最小)元素逐渐"冒"到数组末尾。平均时间复杂度为O(n...
这八种算法包括:直接插入排序、希尔排序、冒泡排序、快速排序、基数排序、堆排序以及2路归并排序和折半插入排序。下面我们将对每一种算法进行详细介绍。 1. **直接插入排序**:这是一种简单的排序算法,它将待排序...