zoukankan      html  css  js  c++  java
  • 排序

    获取随机数,用于测试排序

    需包含 stdlib.htime.h

    int * getrand(int min, int max, int len)
    {
        int* arr = (int*)malloc(sizeof(int)*len);
        srand(time(NULL));
    
        for(int i=0; i<len; ++i) {
            arr[i] = rand()%(max-min+1) + min;
            printf("%d ",arr[i]);
        }
        printf("
    ");
        return arr;
    }
    
    • 冒泡:基本不用,太慢,要两两交换次数太多。
    • 选择:基本不用,慢而且不稳。
    • 插入:样本小且基本有序的时候效率较高。

    冒泡排序

    void bubbleSort(int a[], int n)
    {
        for(bool sorted=false; !sorted; --n) {
            sorted = true; // 每趟循环前都假定已经排序
            for(int i=1; i<n; ++i)
                if(a[i-1] > a[i]) { // 一旦相邻元素是逆序
                    swap(a[i-1],a[i]);
                    sorted = false; // 发现局部逆序,显然不是排序好的
                }
        }
    }
    

    选择排序

    最好和最差都是 (O(n^2)) 不稳定

    void selectionSort(int *arr,int len)
    {
        int minPos = 0;
        for(int i=0;i<len-1;i++) {
            minPos = i;  // 内层开始先假设最小值在外层起始处
            for(int j=i+1;j<len;j++) // 不断地做比较,如果有更小地就更新最小值地位置
                minPos = arr[j] < arr[minPos] ? j : minPos; 
            // 每一趟下来总是可以选出最小值的位置,然后和最前面的进行交换
            swap(arr,i,minPos);
        }
    }
    

    插入排序

    void insertionSort(int * arr,int n) 
    {
        for(int i=1; i<n; i++) { //从第二个位置开始
            for(int j=i; j>0 && arr[j]<arr[j-1]; j--)
                swap(arr,j,j-1); //如果该位置比前面的小,就不断挪(即插入)到前面合适位置
        }
    }
    

    先挪出空位置,再插入

    void insertionSort2(int * arr,int n) 
    {
        int tmp,j;
        for(int i=1; i<n; i++) { //从第二个位置开始
            if(arr[i] < arr[i-1]) {
                tmp = arr[i];   // 保存位置
                for(j=i; j>0 && arr[j-1]>tmp; j--)
                    arr[j] = arr[j-1]; //前面地值比tmp大的则后挪
                arr[j] = tmp; // 空出来的位置插入tmp
            }
        }
    }
    

    快速排序

    void q_sort(int v[], int left, int right) 
    {
    	if(left >= right)   // 若数组包含的元素少于两个
    		return ;
    	int last = left;	// 设左边元素为子集划分元素
    	for(int i=left+1; i<=right; i++) // 划分子集
    		if(v[i] < v[left])
    			swap(v, ++last, i);
    	swap(v, left, last);			//回复划分子集的元素
    	q_sort(v,left,last-1);
    	q_sort(v,last+1,right);
    }
    
  • 相关阅读:
    Vue与Django数据交互
    Vue部分使用注意事项
    Node.js及npm详细安装教程
    vue组件实现简单的路由
    实现一个简单的marked编辑格式转换器部分功能
    Vue的父子组件数据传递
    Vue数据绑定
    [蓝桥杯][2013年第四届真题]错误票据
    历届试题 连号区间数
    [蓝桥杯][历届试题]蚂蚁感冒
  • 原文地址:https://www.cnblogs.com/wjundong/p/11570036.html
Copyright © 2011-2022 走看看