5种常见排序算法原理&C语言实现

一、冒泡排序(以下各法均以从小到大排序为例,定义len为数组array的长度)

  1. 原理:比较相邻元素的大小,对于每次循环,按排序的规则把最值移向数组的一端,同时循环次数依次减少。
  2. C代码实现
  • 写法一:

    //从数组头部开始,某一个元素与其后面的每个元素作比较for(i=0;i<len-1;i++)
        for(j=i+1;j<len;j++)
        {
            if(array[i]>array[j])
            {
                t=array[i];array[i]=array[j];array[j]=t;
            }
        }
  • 写法二:

    //从数组的头部开始,相邻元素之间作比较
    for(i=0;i<len-1;i++)
            for(j=0;j<len-1-i;j++)
            {
                if(array[j]>array[j+1])
                {
                    t=array[j];array[j]=array[j+1];array[j+1]=t;
                }
            }
  • 写法三:

    //从数组的结尾返回,相邻元素之间作比较
    for(i=0;i<len;i++)
            for(j=len-1;j>i;j--)
        {
            if(array[j-1]>array[j])
            {
                t=array[j];array[j]=array[j-1];array[j-1]=t;
            }
        }

二、选择排序

1.原理:先在未排序序列找出最值,将其与序列起始位置的元素互换(即将最值存放到起始位置),然后再从剩余未排序序列中找到该最值,将其放在已排序序列的末尾。以此类推,直到整个序列排完序。

2.C代码实现

for(i=0;i<len-1;i++)
    {
        k=i;
        for(j=i+1;j<len;j++)
        {
            if(array[k]>array[j])
            {
                k=j;
            }
        }
        if(i!=k)
            {
                t=array[i];array[i]=array[k];array[k]=t;
            }
    }

三、插入排序(此处为直接插入排序,另外还有二分插入、链表插入等排序)

1.原理:将数据分为有序数列和无序数列两部分,一开始有序数列只有数列的第一个元素。对于无序数列的每个元素,要插入到有序数列中,方法是与有序数列中的末尾元素开始作比较,确定这个待插入元素小于第n个元素且大于或等于第n-1个元素,则将其插入到两个元素之间。以此类推,直到无序数列元素个数为0。

2.C代码实现

for(i=0;i<len;i++)
    {
        j=i-1;
        k=array[i];
        while(j>-1&&k<array[j])
        {
            array[j+1]=array[j];
            j--;
        }
        array[j+1]=k;
    }

四、快速排序

2.C代码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

void quicksort(int ary[],int left,int right)
{
    int i=left,j=right,k=ary[left],t;//k储存准基数

    if(i>j)
        return ;

    while(i!=j)
    {
        while(i<j&&ary[j]>=k)//必须是先从右边比较,否则准基数归位时将出错
            j--;
        while(i<j&&ary[i]<=k)
            i++;
        if(i<j)
        {
            t=ary[i];ary[i]=ary[j];ary[j]=t;
        }
    }
    ary[left]=ary[i];
    ary[i]=k;
    quicksort(ary,left,i-1);
    quicksort(ary,i+1,right);
}

int main()
{
    int i,len=7,array[100]={4,8,7,7,445,78,87};
    printf("%d\n",len);

    quicksort(array,0,len-1);

    for(i=0;i<len;i++)
        printf("%d  ",array[i]);
    return 0;
}

五、归并排序

1.原理:归并排序采用递归实现,总体上有两个步骤(分解与合并):将待排序序列R[0...n-1]看成是n个长度为1的有序序列,将相邻的两个元素有序归并,得到n/2个长度为2的有序序列;将这些有序序列再次归并,得到n/4个长度为4的有序序列;如此反复进行下去,最后得到一个长度为n的有序序列。

合并的具体步骤:比较arr[i]和arr[j],若arr[i]<arr[j],则将arr[j]复制到新的数组new_arr[k],并让i,j都加上1;否则,将arr[j]复制到new_arr[k],并让i,j都加上1。如此循环下去,直到其中一个数组被复制完,再让另一个数组剩余的元素直接拼接到的new_arr的后面。

2.C代码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

void merge_sort2(int arr1[],int new_arr1[],int left1,int right1,int mid1)
{
    int i=left1,j=mid1+1,k=left1;

    while(i!=mid1+1&&j!=right1+1)//合并
    {
        if(arr1[i]>arr1[j])
            new_arr1[k++]=arr1[j++];
        else
            new_arr1[k++]=arr1[i++];
    }
    while(i!=mid1+1)
        new_arr1[k++]=arr1[i++];
    while(j!=right1+1)
        new_arr1[k++]=arr1[j++];
    for(i=left1;i<=right1;i++)
        arr1[i]=new_arr1[i];
}

void merge_sort1(int arr1[],int new_arr1[],int left1,int right1)
{
    int mid1;
    if(left1<right1)
    {
        mid1=(left1+right1)/2;
        merge_sort1(arr1,new_arr1,left1,mid1);//分解
        merge_sort1(arr1,new_arr1,mid1+1,right1);
        merge_sort2(arr1,new_arr1,left1,right1,mid1);
    }
}

int main()
{
    int i,arr[7]={4,8,7,7,445,78,87},new_arr[7];

    merge_sort1(arr,new_arr,0,6);

    for(i=0;i<7;i++)
        printf("%d  ",arr[i]);
    printf("\n");
    return 0;
}
时间: 2024-08-26 03:08:13

5种常见排序算法原理&C语言实现的相关文章

几种常见排序算法

几种常见排序算法 几种常见排序算法 写在前面 基础介绍 初级排序算法 selection sort选择排序 insertion sort插入排序 ShellSort希尔排序 shuffing不是排序算法 merge sort归并排序 Abstract in-place merge原地归并的抽象方法 Top-down mergesort自顶向下的归并排序 Bottom-up mergesort自底向上的归并排序 quicksort 三向切分的快速排序 Heapsort堆排序 总结和比较 命题 本文

JavaScript版几种常见排序算法

今天发现一篇文章讲“JavaScript版几种常见排序算法”,看着不错,推荐一下原文:http://www.w3cfuns.com/blog-5456021-5404137.html 算法描述: * 冒泡排序:最简单,也最慢,貌似长度小于7最优* 插入排序: 比冒泡快,比快速排序和希尔排序慢,较小数据有优势* 快速排序:这是一个非常快的排序方式,V8的sort方法就使用快速排序和插入排序的结合* 希尔排序:在非chrome下数组长度小于1000,希尔排序比快速更快* 系统方法:在forfox下系

几种常见排序算法的基本介绍,性能分析,和c语言实现

本文介绍7种常见的排序算法,以及他们的原理,性能分析和c语言实现: 为了能够条理清楚,本文所有的算法和解释全部按照升序排序进行 首先准备一个元素无序的数组arr[],数组的长度为length,一个交换函数swap, 在main函数中实现排序函数的调用,并输出排序结果: void swap(int*x , int*y) { int temp = *x; *x = *y; *y = temp; } int main() { int arr[] = { 1,8,5,7,4,6,2,3}; int le

几种经典排序算法的R语言描述

1.数据准备 # 测试数组 vector = c(5,34,65,36,67,3,6,43,69,59,25,785,10,11,14) vector ## [1] 5 34 65 36 67 3 6 43 69 59 25 785 10 11 14 2.R语言内置排序函数 在R中和排序相关的函数主要有三个:sort(),rank(),order(). sort(x)是对向量x进行排序,返回值排序后的数值向量; rank()是求秩的函数,它的返回值是这个向量中对应元素的“排名”; order()

Java中几种常见排序算法

日常操作中常见的排序方法有:冒泡排序.快速排序.选择排序.插入排序.希尔排序等. 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端. * 冒泡法排序 * 比较相邻的元素.如果第一个比第二个大,就交换他们两个. * 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应

几种常见排序算法的总结

下面总结几种常见的排序算法,包括插入排序.选择排序.快速排序.归并排序和堆排序. 时间复杂度: 插入排序 选择排序 快速排序 归并排序 堆排序 Ο(n2) Ο(n2) Ο(nlog(n)) Ο(nlog(n)) Ο(nlog(n)) 算法概述: 插入排序:每次从未排好序的数据堆中拿出一个数,插入到已排好序的数据队列的正确位置. 选择排序:每次从未排好序的数据堆中找到最小的数,插入到已排好序的数据队列的头部. 快速排序:以数据堆中的一个数为标准,将数据堆分为小于等于和大于该数的两堆,对于分割后的两

Java实现9种常见排序算法

常见的排序算法有冒泡排序.选择排序.插入排序.堆排序.归并排序.快速排序.希尔排序.基数排序.计数排序,下面通过Java实现这些排序 1.冒泡排序 package com.buaa; import java.util.Arrays; /** * @ProjectName SortingAlgorithm * @PackageName com.buaa * @ClassName BubbleSort * @Description 冒泡排序 * @Author 刘吉超 * @Date 2016-05

php几种常见排序算法

<?php //从时间上来看,快速排序和归并排序在时间上比较有优势,//但是也比不上sort排序,归并排序比较占用内存! $arr = [4,6,1,2,3,89,56,34,56,23,65];/** * 冒泡排序 * 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来. * 走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成 */function BubbleSortq($arr) { $len = count($arr); //设置一个空

C语言中的几种常见排序算法

1.冒泡排序法:如果有N个数,两两相邻进行比较,将最值沉入最后一位置,要进行N-1轮比较, 第一轮要比较N-1次,第2轮只要比较N-1-1次,因为第一次已经把最值沉入最后一位置,故 不需在进行比较一次,也就是说每一轮都减少一次,所以第2个for循环中j < n-1;下列代码是升序排序 1 void bubble_sort(int *num, int n) 2 { 3 int num_temp; 4 for (int i=0; i<n; i++) 5 for (int j=0; j<n-i