数据结构和算法

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

线性表:链接

堆、栈和队列:链接

排序算法总结:链接

//冒泡排序
    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;
    }

 

树和二叉树:链接

图:链接

 

posted @ 2019-07-08 14:06  墨染尘  阅读(173)  评论(0)    收藏  举报
Paris