二分查找
public class BinarySearch {
public int binarySearch(int[] a,int result)
{
int len=a.length;
int left=0;
int right=len-1;
int mid;
while (left<=right)
{
mid=(left+right)/2;
if(a[mid]<result)
{
left=mid+1;
}
else if(a[mid]>result)
{
right=mid-1;
}
else {
return mid;
}
}
return -1;
}
}
冒泡排序
public class BubbleSort {
public void BubbleSort(int[] a)
{
for(int i=0;i<a.length;i++)
for(int j=1;j<a.length-i;j++)
{
if(a[j-1]>a[j])
{
int temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
}
}
public void BubbleSort2(int[] a)
{
for(int i=0;i<a.length;i++)
{
int flag=0;
for(int j=1;j<a.length-i;j++)
{
if(a[j-1]>a[j])
{
flag=1;
int temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
}
if(flag==0)
{
return;
}
}
}
}
插入排序
public class InsertSort {
//插入排序.比较和移动同时进行
public void insertSort(int[] a)
{
if(a==null)
{
return;
}
for(int i=1;i<a.length;i++)
{
int temp=a[i];
int j=i-1;
while (j>=0&&temp<a[j]){
a[j+1]=a[j];
j--;
}
a[j+1]=temp;
}
}
//折半插入排序
public void binaryInsertSort(int[] a)
{
int len=a.length;
int mid;
int target;
for (int i=1;i<len;i++)
{
int left=0;
int right=i-1;
target=a[i];
//出了while循环后left索引的值一定大于等于target,right的值一定小于等于target
while (left<=right)
{
mid=(left+right)/2;
if(target<a[mid])
{
right=mid-1;
}
if(target>=a[mid])
{
left=mid+1;
}
}
for(int j=i-1;j>=left;j--)
{
a[j+1]=a[j];
}
a[left]=target;
}
}
#
public void merge(int[] data,int start,int mid,int end)
{
//如果想将只含有两个元素的数组分成两部分,左边数组的长度需按一下方式写,如果之后的mid=(right+left)/2;
//归并的思想是将两个有序的子序列归并成一个有序的序列
int len1=mid-start+1;
int len2=end-mid;
int[] left=new int[len1];
int[] right=new int[len2];
for(int i=0;i<len1;i++)
{
left[i]=data[start+i];
}
for(int i=0;i<len2;i++)
{
right[i]=data[mid+1+i];
}
int i=0,j=0;
int k;
for(k=start;k<end;k++)
{
if(i==len1||j==len2)
{
break;
}
if(left[i]<=right[j])
{
data[k]=left[i++];
}
else
{
data[k]=right[j++];
}
}
while (i<len1)
{
data[k++]=left[i++];
}
while (j<len2)
{
data[k++]=right[j++];
}
}
public void merge(int[] a,int start,int end)
{
int mid=(start+end)/2;
int len1=mid-start+1;
int len2=end-mid;
int[] left=new int[len1];
int[] right=new int[len2];
for(int i=0;i<len1;i++)
{
left[i]= a[start+i];
}
for (int i=0;i<len2;i++)
{
right[i]=a[mid+1+i];
}
int i=0,j=0,k=0;
for(k=start;k<end;k++)
{
if(i==len1||len2==len2)
{
break;
}
if(left[i]<=right[j])
{
a[k]=left[i++];
}else {
a[k]=right[j++];
}
}
while (i<len1)
{
a[k++]=left[i++];
}
while (j<len2)
{
a[k++]=right[j++];
}
}
public void mergeSort(int[] data,int start,int end)
{
//将数组元素分解到只剩下两个元素,肯定是可以执行归并的.
if(start<end)
{
int mid=(start+end)/2;
mergeSort(data,start,mid);
mergeSort(data,mid+1,end);
merge(data,start,end);
}
}
快速排序
public class QuickSort {
public int partition(int[] a,int left,int right)
{
int pivot=a[left];
//跳出循环时left==right
while (left<right)
{
pivot=a[left];
while (left<right&&a[left]<pivot)
{
left++;
}
a[right]=a[left];
while (left<right&&a[right]>pivot)
{
right--;
}
a[left]=a[right];
}
a[left]=pivot;
return left;
}
public void QuickSort(int[] a,int left,int right)
{
if(left<right)
{
int p=partition(a,left,right);
QuickSort(a,left,p-1);
QuickSort(a,p+1,right);
}
}
选择排序
public class SelectionSort {
//每次遍历都选择最小的元素放在合适的位置
public void selectionSort(int[] a)
{
for (int i=1;i<a.length;i++)
{
int min=i-1;
for(int j=min;j<a.length;j++)
{
if(a[min]>a[j])
{
min=j;
}
}
if(min!=i-1)
{
int temp=a[i-1];
a[i-1]=a[min];
a[min]=temp;
}
}
}
@Test
public void test()
{
int[] a={5,3,2,1,0};
String arraystring= Arrays.toString(a);
System.out.print(arraystring);
arraystring= Arrays.toString(a);
System.out.print(arraystring);
}
}
希尔排序
public class ShellSort {
public void shellSort(int[] a)
{
int d=a.length/2;
while (d>=1)
{
for (int k=0;k<d;k++)
{
for (int i=k+d;i<a.length;i+=d)
{
int temp=a[i];
int j=i-d;
while (j>=k&&a[j]>temp)
{
a[j+d]=a[j];
j-=d;
}
a[j+d]=temp;
}
}
d=d/2;
}
}
}