哎...很久没有写东西啦,一方面因为自己懒,另一方面最近事情实在是太多。这块毕业啦,忙着找工作,所以把一些基础算法拿出来复习下,在这也记录下,希望能分享给需要的朋友。
一、选择排序和插入排序 最简单的排序方法,时间复杂度O(n2) 空间复杂度 O(1)
class selectSort
{
public static void main(String[] args)
{
System.out.println("Hello World!");
int arr[]={1,4,6,3,2,7,4432,5,2};
//selectSort(arr);
insertSort(arr);
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
//选择排序 时间复杂度 O(n2) 空间复杂度 O(1)
static void selectSort(int[]arr){
int len;
if(arr==null||(len=arr.length)==0)
return ;
for(int i=0;i<len;i++){
int big=arr[0];
int bigIndex=0;
for(int j=1;j<len-i;j++)
{
if(big<arr[j])
{
big=arr[j];
bigIndex=j;
}
}
int temp=arr[len-1-i];
arr[len-1-i]=big;
arr[bigIndex]=temp;
}
}
//插入排序
static void insertSort(int arr[]){
int len;
if(arr==null||(len=arr.length)==0)
return ;
for(int i=1;i<len;i++){
int j=i-1;
int temp=arr[i];
while(j>=0&&arr[j]>temp){
arr[j+1]=arr[j];
j--;
}
if(j!=i-1){
arr[j+1]=temp;
}
}
}
}
二、归并排序
class MergeSort
{
static void mergeSort(int data[],int left,int right){
if(right>left){
int middle=(left+right)/2;
mergeSort(data,left,middle);
mergeSort(data,middle+1,right);
merge(data,left,middle,right);
}
}
static void merge(int data[],int left,int middle,int right){
int lenght=data.length;
int helper[]=new int[lenght];
int l=left,r=middle+1,p=left; //l:合并左边数组的当前位置 r :左边数组当前位置 p:helper当前插入元素到哪个位置
while(l<=middle&&r<=right){
if(data[l]>=data[r]){
helper[p]=data[r];
r++;
}else{
helper[p]=data[l];
l++;
}
//System.out.println(helper[p]);
p++;
}
//之后复制剩余左右数组元素 且只有一边还剩下元素
while(l<=middle){
helper[p]=data[l];
l++;
p++;
}
while(r<=right){
// System.out.println(r+" "+p);
helper[p]=data[r];
r++;
p++;
}
//之后将helper数组复制回data
for(int i=left;i<=right;i++){
data[i]=helper[i];
}
}
public static void main(String[] args)
{
int data[]={3,2,55,3,45,243,75,12,999};
mergeSort(data,0,data.length-1);
for(int i=0;i<data.length;i++){
System.out.println(data[i]);
}
}
}