首页 > 编程语言 > 详细

排序算法——选择排序、冒泡排序、插入排序、快速排序(C语言)

时间:2021-02-16 23:19:43      阅读:39      评论:0      收藏:0      [点我收藏+]
void Bubble_sort(int *a, int n)
{
    for (int i = 0; i < n - 1; i++)
    {
        for (int j = 0; j < n - 1; j++)
        {
            if (a[j] > a[j + 1])
            {
                int tmp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = tmp;
            }
        }
    }
}
void Selection_sort(int *a, int n)
{
    for (int i = 0; i < n - 1; i++)
    {
        int k = i;
        for (int j = i + 1; j < n; j++)
        {
            if (a[j] < a[k])
            {
                k = j;
            }
        }
        int tmp = a[i];
        a[i] = a[k];
        a[k] = tmp;
    } 
}
void Insertion_sort(int *arr, int n)
{
    int tmp;
    int j;
    for (int i = 0; i < n; i++)
    {
        tmp = arr[i];
        for (j = i; j > 0 && arr[j - 1] > tmp; j--)
        {
            arr[j] = arr[j - 1];
        }
        arr[j] = tmp;
    }
}
void quick_sort(int *arr, int begin, int last)
{
    int left = begin;
    int right = last;
    if (begin < last)
    {
        int pivot = arr[left];
        while (left < right)
        {
            while (left < right && arr[right] >= pivot)
            {
                right--;
            }
            if (left < right)
            {
                arr[left] = arr[right];
            }
            while (left < right && arr[left] <= pivot)
            {
                left++;
            }
            if (left < right)
            {
                arr[right] = arr[left];
            }
        }
        arr[left] = pivot;
        //递归-----这个时候当前数组的枢轴数已经被放到这个数组的中间了,以枢轴为基准,划分出另外两个数组
        quick_sort(arr, begin, left - 1); //处理枢轴左边数组
        quick_sort(arr, left + 1, last);  //处理枢轴右边数组
    }
}

冒泡排序的内层循环用来比较,如果a[j]大于a[j+1] 则将这两个元素位置互换, 外层循环则是用来排序,确保所有元素都以合适的位置存放,而不是只进行一次排序(也就是只进行了一次内层循环)

选择排序则是将a[i]预设为剩下未排序元素中最小,随后对未排序元素进行遍历【之前排序的元素已经按顺序排好】,当遇到小于a[i]的数时,将smallest置为j【未排序元素中最小元素的位置】,之后将a[i]和a[j]的元素互换。

插入排序则是将一个未排序元素插入到有序元素组中。 内部循环找到tmp合适的位置(也就是当a[j-1]<tmp时的位置)。而将大于tmp的a[j-1]则排到后面去。【因为它们大于tmp】 外层循环确保排序正常。

快速排序则是利用递归和左右依次扫描实现,属于分而治之思想。它先找到一个pivot——枢轴值,通常是a[begin], 之后进行循环,首先循环右边,当右边的元素都大于枢轴值并且右边的索引大于左边的索引时,每次右边索引--; 直到遇到左边索引或者遇到一个小于枢轴值且在右侧的值; 这时将它移到枢轴的左边(a[left]=a[right]) 之后进行左边,左边的思路就是反其道而行之。

最后当left索引==right索引时,就跳出循环,因为已经到了这个数组的中央了,这个位置放置枢轴值。 之后以这个位置 分割出两个新的数组。用递归给这两个数组进行新的快排,直到所有元素的顺序都排对了。

排序算法——选择排序、冒泡排序、插入排序、快速排序(C语言)

原文:https://www.cnblogs.com/yurizero/p/14407206.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!