Java数组与排序问题

来源:互联网 发布:淘宝恶意评价投诉入口 编辑:程序博客网 时间:2024/06/05 18:34

数组

Java中包括基本类型和对象类型,其中数组属于对象类型。(虽然在C++中数组也是基本类型)

int[] a;a=new int[100];//int[] a=new int[100]

数组存储在其他的地址中,a中指保存内个地址。
数组一旦创建,大小不会改变。初始化为空null,当我们尝试访问含有null数组数据项时,会得到空指针报错。
数组可以按照无须数组和有序数组来进行分别学习。

算法 时间复杂度 线性查找 O(N)(还可以) 二分查找 O(logN)(良好) 无序数组的插入 O(1)(优秀) 有序(无序)数组的删除 O(N) 有序数组的删除 O(N)

简单排序

  • 冒泡排序
public void bubleSort(){    int out,in;    for(out=n-1;out>1;out--){        for(in=0;in<out;in++){            if(a[in]>a[in+1])                 swap(in,in+1);            }        }    }//endprivate void swap(int m,int n){    long temp=a[m];    a[m]=a[n];    a[n]=temp;    }

思路:数组由小到大进行排序,每次将两个相邻的数据进行比较,将大的那个放在右边,整一套下来,保证了最大的在最右边。也就是说内部的in的循环结束后,下标大于out的数据项已经排好。
时间复杂度:O(N^2),可以说是相当慢了

  • 选择排序
public void selectionSort(){    int out,in,min;    for(out=0;out<n-1;out++){        min=out;        for(in=out+1;in<n;in++){            if(a[in]<a[min]) min=in;        swap(out,min);//swap()函数同上,实际交换的是引用的位置        }    }}//end

不同于冒泡排序中数组下标大于out的总是有序的,在选择排序中,数组下标小于in的总是有序的。
选择排序中,进行的比较次数和冒泡排序中的一样多,但是交换次数只有O(N),但是我们认为N值很大时,时间复杂度依然是O(N^2)。但是选择排序会比冒泡排序要快很多啦。
- 插入排序

public void insertionSort(){    int in,out;    for(out=1;out<n;out++){        long temp=a[out];        in=out;        while(in>0&&a[in-1]>temp){            a[in]=a[in-1];            --in;            }        a[in]=temp;        }    }

每一趟之后,比out下标小的总是有序的。out标记了未排序部分的最左端数据,in从out变量向左移动,直到temp值小于in所指的数组数据项。
适用于基本有序的数组。


tips:
复制是交换的三倍
在插入排序中,一个数据项被插入到局部有序的组合后,他将永远不会向左边移动。
稳定性是指在对州进行排序时,每个周的城市还要求按照人口递增排序。

原创粉丝点击