zoukankan      html  css  js  c++  java
  • 数据结构——排序算法

    数据结构算法

    排序序列默认递增

    插入排序

    直接插入排序代码

    //直接插入排序
    void InsertSort(int A[], int n){
        int i, j;
        for(i = 2; i < n; i++){        //将A[2]-A[n]插入到前面已排序序列
            if(A[i] < A[i-1]){          //若A[i]小于前驱,需将A[i]插入有序表
                A[0] = A[i];             //复制为哨兵,A[0]不存放元素
                for(j = i-1; A[0] < A[j]; j--){   //从后往前查找待插入位置
                    A[j+1] = A[j];     //向后挪位
                }
               	A[j+1] = A[0];          //复制到插入位置
            }
        }
    }
    

    折半插入排序代码

    //折半插入排序
    void InsertSort(int A[], int n){
        int i,j,low,high,mid;
        for(i = 2;i <= n; i++){         //将A[2]-A[n]插入到前面已排序序列
            A[0] = A[i];                //将A[i]暂存到A[0]
            low = 1;                    //设置折半查找的范围
            high = i-1;
            while(low <= high){          //折半查找,默认递增有序
                mid = (low+high)/2;      //取中间点
                if(A[mid] > A[0]){      
                    high = mid-1;        //查找左半子表
                }else{
                    low = mid+1;         //查找右半子表
                }
            }
            for(j = i-1;j >=high+1; j--){
                A[j+1] = A[j];           //统一插入后
            }
            A[high+1] = A[0];            //插入操作
        }
    }
    

    交换排序

    冒泡排序

    //冒泡排序
    void BubbleSort(int A[], int n){
        int i,j;
        bool flag;
        for(i = 0; i < n-1; i++){
            flag = false;
            for(j = n-1; j > i; j--){
            	if(A[j-1] > A[j]){         //若为逆序
                 	swap(A[j-1], A[j]);     //交换
                  	flag = true;
               	}
           	}
           	if(flag == false)
           	{
                return ;                   //本趟遍历后没有发生交换,说明表已经有序
            }
        }
    }
    

    快速排序

    //快速排序
    //Partition()就是划分操作,将表A[low,...,high]划分为满足条件的两个子表
    int Partition(int A[], int low, int high){
        int pivot = A[low];    //将当前表中第一个元素设为枢轴值,对表进行划分
        while(low < high){
            while(low < high && A[high] >= pivot){
                high--;
            }
            A[low] = A[high];    //将比枢轴值小的元素移动到左端
            while(low < high && A[low] <= pivot){
                low++;
            }
            A[high] = A[low];    //将比枢轴值大的元素移动到右端
        }
        A[low] = pivot;          //枢轴元素存放到最终位置
        return low;              //返回存放枢轴的最终位置
    }
    
    void QuickSort(int A[], int low, int high){
        if(low < high){
            int pivotpos = Partition(A, low, high); //划分
            QuickSort(A, low, pivotpos-1);    //依次对两个子表进行递归排序
            QuickSort(A, pivotpos+1, high);
        }
    }
    

    选择排序

    简单选择排序

    //简单选择排序
    void SelectSort(int A[], int n){
        //从A[0]开始存放元素
        int i,min;
        for(i = 0; i < n-1; i++){
            min = i;
            for(j = i+1; j < n; j++){
                if(A[j] < A[min]){
                    min = j;               //更新最小元素位置
                }
            }
            if(min != i){
                swap(A[i], A[min]);         //与第i个位置交换
            }
        }
    }
    

    堆排序

    堆排序,最大堆用于递增排序,最小堆用于递减排序

    //将元素k向下调整
    void AdjustDown(int A[], int k, int len){
        int i;
        A[0] = A[k];   //A[0]暂存元素k
        for(i = 2*k; i <= len; i *= 2){ //向下筛选子节点
            if(i<len && A[i]<A[i+1]){   //比较兄弟节点,选出值大的节点与父节点比较
                i++;
            }
            if(A[0]>= A[i]){    //父节点比子节点中最大的还大,所以筛选结束
                break;
            }else{
               	A[k] = A[i];     //将A[i]调整到父节点处,不用管父节点原来的值,因为在A[0]暂存
                k = i;           //修改k的值,继续向下筛选
            }
        }
        A[k] = A[0];           //被筛选的节点放入最终位置
    }
    
    //建立大根堆
    void BuildMaxHeap(int A[], int len){
        for(int i = len/2; i > 0; i--){  //从i = [n/2]~1,反复调整堆
            AdjustDown(A,i,len);
        }
    }
    
    //堆排序
    void HeapSort(int A[], int len){
        BuildMaxHeap(A,len);
        int i;
        for(i = len; i > 1; i--){
            swap(A[i],A[1]);      //将堆顶元素和堆底元素交换
            AdjustDown(A,1,i-1); 
        }
    }
    
    int main(){
        int a[8] = {0,7,9,2,4,6,8,10};
        HeapSort(a, 7);
        
        for(int i =1;i<8;i++){
        	   cout<<a[i]<<" ";
        }
        return 0;
    }
    

    归并排序

    //归并排序
    int *B=(int *)malloc((n+1)*sizeof(int)); //辅助数组B
    void Merge(int A[], int low, int mid, int high){
        //表A的两段A[low,...,mid]和A[mid+1,...,high]各自有序,将它们合并成一个有序表
        for(int k=low; k<=high; k++){
            B[k] = A[k];             //将A中所有元素复制到B中
        }
        for(int i= low,int j =mid+1, int k=i; i<=mid&&j<=high;k++){
            if(B[i] <= B[j]){        //比较B的左右两段中的元素,将较小值复制到A中
                A[k] = B[i];        
                i++;
            }else{
                A[k] = B[j];
                j++;
            }
        }//for
        //以下两个while()循环只有一个会执行
        while(i <= mid){
            A[k++] = B[i++];  //若第一个表未检测完,复制
        }
        while(j <= high){
            A[k++] = B[j++];   //若第二个表未检测完,复制
        }
    }
    
    void MergeSort(int A[], int low, int high){
        if(low<high){
            int mid = (low+high)/2;
            MergeSort(A,low,mid);
            MergeSort(A,mid+1,high);
            Merge(A,low,mid,high);
        }
    }
    
  • 相关阅读:
    【2018.05.05 C与C++基础】C++中的自动废料收集:概念与问题引入
    【2018.04.27 C与C++基础】关于switch-case及if-else的效率问题
    【2018.04.19 ROS机器人操作系统】机器人控制:运动规划、路径规划及轨迹规划简介之一
    March 11th, 2018 Week 11th Sunday
    March 10th, 2018 Week 10th Saturday
    March 09th, 2018 Week 10th Friday
    March 08th, 2018 Week 10th Thursday
    March 07th, 2018 Week 10th Wednesday
    ubantu之Git使用
    AMS分析 -- 启动过程
  • 原文地址:https://www.cnblogs.com/xrblog/p/11587363.html
Copyright © 2011-2022 走看看