数据结构和算法
数据结构是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作。算法是为求解一个问题需要遵循的、被清楚指定的简单指令的集合。下面是常用数据结构与算法相关内容链接。
线性表:链接
堆、栈和队列:链接
排序算法总结:链接

//冒泡排序 public static int[] bubbleSort(int [] data){ for(int i = data.length-1;i>=0;i--){ for(int j= 0;j<i;j++){ if(data[j] > data[j+1]){ int tmp = data[j]; data[j] = data[j+1]; data[j+1] = tmp; } } } return data; }
//辅助函数
public static int divide(int[] data, int start, int end){ int base = data[end]; while(start < end){ while(start < end && data[start] <= base) start++; if(start < end){ int temp = data[start]; data[start] = data[end]; data[end] = temp; end--; } while(start < end && data[end] >= base) end--; if(start < end){ int temp = data[start]; data[start] = data[end]; data[end] = temp; start++; } } return end; } //快速排序 public static int[] quickSort(int[] data, int start, int end){ if(start > end){ return data; } else{ //如果不止一个元素,继续划分两边递归排序下去 int partition = divide(data, start, end); quickSort(data, start, partition-1); quickSort(data, partition+1, end); } return data; }
public class HelloWorld { public static void main(String[] args) { int data[] ={3,6,5,7,10,9,1}; //堆排序 HelloWorld main = new HelloWorld(); data = main.heapSort(data); for(int i = 0;i<data.length ;i++){ System.out.print(data[i]+" "); } } /*堆排序建队算法*/ public int[] filterHeap(int data[],int root,int upper){ /*heap为待筛选的堆,root为堆的根结点,upper为无序区的上界*/ int child; //指向孩子结点 int item; //作为过渡变量 int r=root; //r指向根结点 child=2*root+1; //初始时为根结点的左孩子 while(child<upper){ /*比较左右孩子的关键字值,并取大者*/ if(child+1<upper && data[child+1]> data[child]){ child=child+1; } /*若根结点不满足堆的条件,则与孩子交换*/ if(data[r]<data[child]){ item=data[r]; data[r]=data[child]; data[child]=item; r=child; child=2*child+1; //使child>=upper,满足退出的条件 }else break; //若根满足堆的条件,则不交换,并退出筛选 } return data; } public int[] heapSort(int[] data){ /*heap为待排序序列,n为序列长度*/ int i; int item;//过渡变量 int n = data.length; for(i=(n-1)/2;i>=0;i--){ //从第一个非叶子结点开始创建初始堆 filterHeap(data,i,n); } for(i=n-1;i>0;i--){ //做n-1趟排序,每次堆的大小减1 /*将堆顶元素与当前大根堆的最后一个元素交换*/ item=data[0]; data[0]=data[i]; data[i]=item; /*筛选,将0~i的元素重新调整*/ filterHeap(data,0,i); } return data; } }
//简单选择排序 public static int[] simpleSelectionSort(int[] data){ int minIndex; for(int i =0;i<data.length-1;i++){ minIndex = i; for(int j = i+1 ;j<data.length;j++){ if(data[j]<data[minIndex]){ minIndex = j; } } int tmp = data[i]; data[i] = data[minIndex]; data[minIndex] =tmp; } return data; }
//直接插入排序的算法实现 public static int[] directInsertionSort(int[] data){ //第一个元素无比较对象,从第二个开始比较 for(int i = 1;i<data.length;i++){ //比较到第i+1个元素时,依次和他前面i个元素比较大小 //从第一个元素开始(因为第一个最小) c:for(int j= 0;j<i;j++){ //找到前i个中比他大的第一个元素。 if(data[i]<data[j]){ //依次替换,从第i个元素开始替换,替换到制定位置 for(int p = i;p>j ;p--){ int tmp = data[p]; data[p] = data[p-1]; data[p-1] = tmp; } //替换完成之后就结束寻找的循环,对下一个元素进行排序 break c; } } } return data; }
//希尔排序的算法实现 public static int[] shell(int[] arrays){ if(arrays == null || arrays.length <= 1){ return arrays; } //增量 int incrementNum = arrays.length/2; while(incrementNum >=1){ for(int i=0;i<arrays.length;i++){ //进行插入排序 for(int j=i;j<arrays.length-incrementNum;j=j+incrementNum){ if(arrays[j]>arrays[j+incrementNum]){ int temple = arrays[j]; arrays[j] = arrays[j+incrementNum]; arrays[j+incrementNum] = temple; } } } //设置新的增量 incrementNum = incrementNum/2; } return arrays; }
//归并排序 public static int[] mergeSort(int[] data,int low,int high){ int mid = (low+high)/2; if(low<high){ mergeSort(data,low,mid); mergeSort(data,mid+1,high); //左右归并 merge(data,low,mid,high); } return data; } //归并排序的辅助方法 public static void merge(int[] data, 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(data[i]<data[j]){ temp[k++] = data[i++]; //说明:temp[k++] = temp[k] ,只是在temp[k++]之后k的值加1 //说明:temp[++k] = temp[k+1],temp[++k]之后k的值加1 }else{ temp[k++] = data[j++]; } } // 把左边剩余的数移入数组 while(i<=mid){ temp[k++] = data[i++]; } // 把右边边剩余的数移入数组 while(j<=high){ temp[k++] = data[j++]; } // 把新数组中的数覆盖nums数组 for(int x=0;x<temp.length;x++){ data[x+low] = temp[x]; } }
//基数排序 //maxNum表示最大位数 public static int[] radixSort(int[] data ,int digit) { int n = 1; for(int i =0;i<digit;i++){ for(int j = 1;j < data.length; j++){ int num = (data[j]/n)%10; for(int p = 0;p<j;p++){ if(num<(data[p]/n)%10){ int tmp = data[j]; data[j] = data[p]; data[p] = tmp; } } } n = n*10; } return data; }
树和二叉树:链接
图:链接
浙公网安备 33010602011771号