算法实现:JAVA
在阅读大话数据结构这本书的时候记的笔记,一是分享,二是方便自己查找复习
一.目录:
1.原地算法
2.斐波那契数列
3.冒泡排序
4.归并排序
5.希尔排序
6.简单选择排序
7.直接插入排序
二.代码实现
1.原地算法:使用O(1)空间复杂度的所有算法。给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
if(nums==null||nums.length==0) {
return 0;
}
int k = 1;
for(int i=1 ; i<nums.length; i++) { if(nums[i]==nums[i-1]) {
continue;
}else {
nums[k++]=nums[i];
}
}
2.斐波那契数列:F(n+3)=Fn+F(n+1)+F(n+2) F0=0; F1=1; F2=1;
(不用递归 用更快的方法)
int a=0,b=1,c=1;
int result=0;
for(int i=0;i<len;i++){
result=a+b+c;
a=b;
b=c;
c=result;
}
3.冒泡排序
public class TestBubbleSort {
public static void main(String[] args) {
int[] arr=new int[]{9,5,6,2,3,4,1,7,8,11,10,13,12};
// int[] arr=new int[]{1,2,3,5,4,6,7,8,9,10,11,12,13};
for (int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
System.out.println();
bubbleSort(arr);
for (int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
//优化版本2
public static void bubbleSort(int[] arr){
for (int i=0;i<arr.length;i++){
boolean isSorted=true;//有序标记,每一轮的初始状态是有序
for (int j=arr.length-1;j>=1;j--){
if (arr[j]<arr[j-1]){
int temp=arr[j];
arr[j]=arr[j-1];
arr[j-1]=temp;
isSorted=false;//进行了交换,说明不是有序的
}
}
if (isSorted){
break;
}
}
}
//优化版本1
// public static void bubbleSort(int[] arr){
// for (int i=0;i<arr.length;i++){
// for (int j=arr.length-2;j>=i;j--){
// if (arr[j+1]<arr[j]){
// int temp=arr[j+1];
// arr[j+1]=arr[j];
// arr[j]=temp;
// }
// }
// }
// }
// public static void bubbleSort(int[] arr){
// for (int i=0;i<arr.length;i++){
// for (int j=arr.length-1;j>=1;j--){
// if (arr[j]<arr[j-1]){
// int temp=arr[j];
// arr[j]=arr[j-1];
// arr[j-1]=temp;
// }
// }
// }
// }
}
4.归并排序
public class TestMergingSort {
public static void main(String[] args) {
int[] a=new int[]{2,4,3,8,5,1,3};
int[] b=sort(a,0,a.length-1);
for (int i=0;i<b.length;i++){
System.out.println(b[i]);
}
}
public static int[] sort(int[] a, int low, int high){
int mid = (low+high)/2;
if(low<high){
sort(a,low,mid);
sort(a,mid+1,high);
//左右归并
merge(a,low,mid,high);
}
return a;
}
public static void merge(int[] a, int low, int mid, int high) {
int[] temp = new int[high-low+1];
int i= low;
int j = mid+1;
int k=0;
// 把较小的数先移到新数组中
while(i<=mid && j<=high){
if(a[i]<a[j]){
temp[k++] = a[i++];
}else{
temp[k++] = a[j++];
}
}
// 把左边剩余的数移入数组
while(i<=mid){
temp[k++] = a[i++];
}
// 把右边剩余的数移入数组
while(j<=high){
temp[k++] = a[j++];
}
// 把新数组中的数覆盖nums数组
for(int x=0;x<temp.length;x++){
a[x+low] = temp[x];
}
}
}
5.希尔排序
public class TestShellSort {
public static void main(String[] args) {
int[] arr=new int[]{9,5,6,2,3,4,1,7,8,11,10,13,12};
shellSort(arr);
for (int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
public static void shellSort(int[] arr){
int N=arr.length;
//分组,增量设为数组长度的一半
for (int gap=N/2;gap>0;gap/=2){
//对各个分组进行排序
for (int i=gap;i<N;i++){
//将arr[i]插入到所在分组的正确位置上
insertI(arr,gap,i);
}
}
}
public static void insertI(int[] arr,int gap,int i){
int inserted=arr[i];
int j;
//按组进行插入
for (j=i-gap;j>=0&&inserted<arr[j];j-=gap){
arr[j+gap]=arr[j];
}
arr[j+gap]=inserted;
}
}
6.简单选择排序
通过n-i次关键字间的比较,从n-i+1个记录总选出关键字最小的记录,并和第i(1<=i<=n)个记录交换
public class TestSimpleSelectSort {
public static void main(String[] args) {
int[] arr=new int[]{9,5,6,2,3,4,1,7,8,11,10,13,12};
simpleSelectSort(arr);
for (int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
public static void simpleSelectSort(int[] arr ){
int i,j,min;
for (i=0;i<arr.length-1;i++){
min=i;//最小值下标等于当前下标
for (j=i+1;j<=arr.length-1;j++){
if (arr[min]>arr[j]){
//如果有比当前最小值arr[min]还小的值存在,就改变min的值
min=j;
}
}
if (i!=min){
//如果当前下标不等于min 说明找到了最小值,将arr[i]和arr[min]交换
int temp=arr[i];
arr[i]=arr[min];
arr[min]=temp;
}
}
}
}
7.直接插入排序
直接插入排序的基本操作是将一个记录插入到已经排好序的表中,从而得到一个新的、记录数增加1的有序表
public class TestStraightInsetionSort {
public static void main(String[] args) {
int[] arr=new int[]{9,5,6,2,3,4,1,7,8,11,10,13,12};
straightInsertionSort(arr);
for (int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
public static void straightInsertionSort(int[] arr){
int i,j,temp;
for(i=1;i<arr.length;i++) {
temp=arr[i];
for(j=i-1;j>=0;j--) {
if(temp>arr[j]) {
break;
}else {
arr[j+1]=arr[j];
}
}
arr[j+1]=temp;
}
}
}