• 算法学习之快速排序的C语言实现


    近几天在学习简单算法,今天看了一个快速排序和堆排序,堆排序还没搞懂,还是先把快速排序搞清楚吧

    教程网上一艘一大堆,这里选择一个讲的比较通俗的的一个吧:

    http://blog.csdn.net/morewindows/article/details/6684558   感谢博主。

    四种排序算法的比较

    冒泡排序是最慢的排序算法。在实际运用中它是效率最低的算法。它通过一趟又一趟地比较数组中的每一个元素,使较大的数据下沉,较小的数据上升。

    插入排序通过将序列中的值插入一个已经排好序的序列中,直到该序列结束。插入排序是对冒泡排序的改进。它比冒泡排序快两倍。一般不用在数据的值大于 1000 的场合,或数据的个数超过 200 的序列。

    选择排序在实际应用中处于与冒泡排序基本相同的地位。它们只是排序算法发展的初级阶段,在实际中使用较少。但是它们最好理解。

    快速排序是大规模递归的算法,它比大部分排序算法都要快。一般用于数据个数比较多的情况。尽管可以在某些特殊的情况下写出比快速排序快的算法,但是就通常情况而言,没有比它更快的了。快速排序是递归的,对于内存非常有限的机器来说,它不是一个好的选择。


     
    #include <stdio.h>
    #include <stdlib.h>
    
    /*
    快速排序算法学习
    */
    
    void swap(int *a, int *b)
    {
        int temp;
        temp = *a;
        *a = *b;
        *b = temp;
    }
    
    void quickSort(int arr[] ,int start, int end)
    {
        int arrBase, arrMiddle;
    
        int tempStart = start,
            tempEnd = end;
    
        //对于这种递归的函数,内部必须要有一个函数返回的条件
        if(tempStart >= tempEnd)
            return;
    
        //拷贝一个基准值作为后面比较的参数
        arrBase = arr[start];
        while(start < end)
        {
            while(start < end && arr[end] > arrBase)
                end--;
            if(start < end)
            {
                swap(&arr[start], &arr[end]);
                start++;
            }
    
            while(start < end && arr[start] < arrBase)
                start++;
            if(start < end)
            {
                swap(&arr[start], &arr[end]);
                end--;
            }
        }
        arr[start] = arrBase;
        arrMiddle = start;
    
        //分治方法进行递归
        quickSort(arr,tempStart,arrMiddle-1);
        quickSort(arr,arrMiddle+1,tempEnd);
    }
    
    int main()
    {
        int myArr[] = {12,13,15,20,0,-1,-10,100};
    
        int arrLength = sizeof(myArr)/sizeof(int);
        quickSort(myArr,0,arrLength-1);
    
        for(int i = 0; i<arrLength; i++)
            printf("%5d",myArr[i]);
        return 0;
    }
  • 相关阅读:
    6.11 修饰符的适用范围
    5.10 对象与垃圾回收
    5.9 枚举类
    5.8 java 11增强的Lambda表达式
    5.7 内部类
    5.6 接口
    5.5 抽象类
    5.4 final修饰符
    5.3 类成员
    5.2 Object类中两个需要被重写的方法
  • 原文地址:https://www.cnblogs.com/qsyll0916/p/7496886.html
Copyright © 2020-2023  润新知