zoukankan      html  css  js  c++  java
  • 排序算法

    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    #include <time.h>
    using namespace std;
    //插入排序
    void Insert_Sort(int arr[10],int len)
    {
        srand((unsigned)time(NULL));
        int j;
        int tmp = 0;
        for(int i = 1;i < len;i ++)
        {
            tmp = arr[i];
            j = i-1;
            while(j >=0 && arr[j] > tmp)
            {
                arr[j+1] = arr[j];
                j--;
            }
            arr[j+1] = tmp;
        }
    }
    //希尔排序
    void Shell_Sort(int arr[],int len,int div)
    {
        int j,tmp;
        for(int i = div;i < len;i += div)
        {
            tmp = arr[i];
            j = i - div;
            while(j >=0 && arr[j] > tmp)
            {
                arr[j+div] = arr[j];
                j -= div;
            }
            arr[j + div] = tmp;
            if(i >= len-div)
            {
                div --;
                i = 0;
            }
            if(div == 0)
                break;
        }
    }
    void Select_Sort(int arr[10],int len)
    {
        int tmp;
        for(int i = 0; i < len;i ++)
        {
            for(int j=i+1;j<len;j++)
            {
                if(arr[i]>arr[j])
                {
                    tmp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = tmp;
                }
            }
        }
    }
    //堆排序
    //建堆
    void HeapAdjust(int *a,int i,int size)  //调整堆
    {
        int lchild=2*i;       //i的左孩子节点序号
        int rchild=2*i+1;     //i的右孩子节点序号
        int max=i;            //临时变量
        if(i<=size/2)          //如果i是叶节点就不用进行调整
        {
            if(lchild<=size&&a[lchild]>a[max])
            {
                max=lchild;
            }
            if(rchild<=size&&a[rchild]>a[max])
            {
                max=rchild;
            }
            if(max!=i)
            {
                swap(a[i],a[max]);
                HeapAdjust(a,max,size);    //避免调整之后以max为父节点的子树不是堆
            }
        }
    }
    
    void BuildHeap(int *a,int size)    //建立堆
    {
        int i;
        for(i=size/2;i>=1;i--)    //非叶节点最大序号值为size/2
        {
            HeapAdjust(a,i,size);
        }
    }
    
    void Heap_Sort(int arr[],int len)
    {
        int i;
        BuildHeap(arr,len);
        for(i=len;i>=1;i--)
        {
            //cout<<a[1]<<" ";
            swap(arr[1],arr[i]);       //交换堆顶和最后一个元素,即每次将剩余元素中的最大者放到最后面
            //BuildHeap(a,i-1);        //将余下元素重新建立为大顶堆
            HeapAdjust(arr,1,i-1);     //重新调整堆顶节点成为大顶堆
        }
    }
    void Bubble_Sort(int arr[],int len)
    {
        for(int i = 0;i < len;i ++)
        {
            for(int j = 0;j < len-i;j ++)
            {
                if(arr[j]>arr[j+1])swap(arr[j],arr[j+1]);
            }
        }
    }
    //快速排序
    void Quick_Sort(int arr[],int left,int right)
    {
        if(left<right)
        {
            int i = left;
            int j = right;
            int x=arr[left];
            while(i<j)
            {
                while(i < j && arr[j] > x)
                    j--;
                arr[i]=arr[j];
                while(i < j && arr[i] < x)
                    i++;
                arr[j]=arr[i];
            }
            arr[i] = x;
            Quick_Sort(arr,left,i-1);
            Quick_Sort(arr,i+1,right);
        }
    }
    //归并排序
    void mergeSort(int a[], int l, int r) { //  8, 5, 4, 9, 2, 3, 6
        if(l >= r) return;   // exit.
        int mid = (l+r) / 2; // overflow  <->  l + (r-l)/2
        mergeSort(a, l, mid);
        mergeSort(a, mid+1, r);
        int *arr = new int[r-l+1];
        int k = 0;
        int i = l, j = mid + 1;
        while(i <= mid && j <= r) {
            if(a[i] <= a[j]) {
                arr[k++] = a[i++];
            }
            else {
                arr[k++] = a[j++]; // ans += (mid-i+1);
            }
        }
        while(i <= mid) arr[k++] = a[i++];
        while(j <= r) arr[k++] = a[j++];
        for(int i = l; i <= r; i++) {
            a[i] = arr[i-l];
        }
        delete []arr;
    }
    int main()
    {
        int arr[10];
        //随机生成小于10的数组
        for(int i = 0;i < 10;i ++)
            arr[i] = rand()%10;
    
        for(int i = 0;i < 10;i ++)
            printf("%d	",arr[i]);
        //插入排序
        //Insert_Sort(arr,10);
        //for(int i = 0;i < 10;i ++)
            //printf("%d	",arr[i]);
        //shell 排序
        //Shell_Sort(arr,10,3);
        //选择排序
        //Select_Sort(arr,10);
        //冒泡排序
        //Bubble_Sort(arr,10);
        //堆排序
        //Heap_Sort(arr,10);
        //快速排序
        //Quick_Sort(arr,0,9);
        //归并排序
        mergeSort(arr,0,9);
        //排完序输出
        for(int i = 0;i < 10;i ++)
            printf("%d	",arr[i]);
        return 0;
    }
    

  • 相关阅读:
    贝塞尔曲线应用(贝塞尔插值)
    贝塞尔曲线原理(简单阐述)
    STL头文件有哪些及简单介绍
    句柄与MFC对象关系和相互获取
    Reflect
    Set 和 Map 数据结构
    Symbol
    对象的新增方法
    对象的扩展
    数组的扩展
  • 原文地址:https://www.cnblogs.com/xiaofeiwang/p/3825014.html
Copyright © 2011-2022 走看看