美文网首页
简单排序算法

简单排序算法

作者: 东风谷123Liter | 来源:发表于2017-11-21 23:48 被阅读0次

先说说 排序 吧,
书上的定义:假设含有n个记录的序列为{ r1, r2, r3, r4, ......, r5 },其相应的关键字为{ k1, k2, k3, ......, k4 },需确定1,2,3,......,n的一种排列p1, p2, p3, ...... ,pn,使其相应的关键字满足Kp1 <= Kp2 <= ......<=Kpn(非递减或非递增)关系,即使的序列成为一个按关键字有序的序列{ Rp1, Rp2, ........ Rpn },这样的 操作就成为排序。
不知道你感觉如何,反正我看得一头雾水。简单的讲排序就是将一组记录按一定的规律排列的这个操作就叫排序。需要注意的是:

  1. 通常把数据元素称为记录
  2. 关键字就是指排列参照的条件,关键字主关键字次关键字之分。
  3. 多个关键字的排序可以转换成单个关键字的排序。
  4. 排序的稳定性

简单的讲,主关键字相同的两个记录根据次关键字再次进行排序,在排序前后的顺序两个记录的前后顺序不变就排序方法是稳定的,反之排序方法则是非稳定

  1. 内排序外排序

内排序是在排序的整个过程中,待排序的所有记录全部被放置在内存中。外排序是由于排序的记录个数过多,不能同时放置在内存中,整个排序过程需要在内外存之间多次进行数据交换才能进行。

这里我们主要介绍内排序的多种方法。

  1. 排序算法主要受三个方面的影响:
  1. 时间性能:时间复杂度
  2. 空间性能:空间复杂度
  3. 算法的复杂性:算法本身的复杂性

冒泡排序(由于比较简单,不过多解释 )

屌丝冒泡排序(非正宗)

#include<stdio.h>
void Bboblesort( int a[], int n )
{
    int i, j, temp, count1=0, count2=0;
    for ( i = 0; i < n; ++i)
    {   
        for ( j = i+1; j < n; ++j)
        {
            count1++;
            if( a[i] > a[j] )
            {
                count2++;
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
    }
    printf("总共比较%d次,交换%d次\n", count1, count2 );
}
int main(int argc, char const *argv[])
{
    int a[10] = { 4, 5, 5, 6, 7, 8, 9, 0, 1, 3 };
    Bboblesort( a, 10 );
    for (int i = 0; i < 10; ++i)
    {
        printf(" %d ", a[i] );
    }
    printf("\n");
    return 0;
}

正宗冒泡排序(优化后):

#include<stdio.h>
void Bboblesort( int a[], int n )
{
    int i, j, temp, count1=0, count2=0, flag=1; /*flag 起到标志作用,让算法得以优化*/
    for ( i = 0; i < n && flag; ++i)
    {   
        for ( j = n-1; j > i; --j)
        {
            count1++;
            flag = 0;
            if( a[j-1] > a[j] )
            {
                count2++;
                temp = a[j-1];
                a[j-1] = a[j];
                a[j] = temp;
                flag = 1;
            }
        }
    }
    printf("总共比较%d次,交换%d次\n", count1, count2 );
}
int main(int argc, char const *argv[])
{
    int a[10] = { 4, 5, 5, 6, 7, 8, 9, 0, 1, 3 };
    Bboblesort( a, 10 );
    for (int i = 0; i < 10; ++i)
    {
        printf(" %d ", a[i] );
    }
    printf("\n");
    return 0;
}

选择排序:

#include <stdio.h>
void StrSel( int a[], int n )
{
    int i, j, min, temp, count1=0, count2=0;
    for ( i = 0; i < n-1; ++i)
    {
        min = i;
        for ( j = i+1; j < n; ++j)
        {
            count1++;
            if( a[j] < a[min] )
            {
                min = j;
            }
        }
        if( min != i )
        {
            count2++;
            temp = a[i];
            a[i] = a[min];
            a[min] = temp;
        }

    }
    printf("比较%d次,交换%d次\n", count1, count2 );
}
int main(int argc, char const *argv[])
{
    int a[10] = { 5, 6, 7, 2, 3, 1, 9, 8, 4, 0};
    StrSel( a, 10 );
    for (int i = 0; i < 10; ++i)
    {
        printf(" %d ", a[i]);
    }
    printf("\n");
    
    return 0;
}

未完,后续再更新

相关文章

  • 算法与数据结构(二):排序篇-O(n^2)算法:选择 &

    排序基础 O(n^2)的算法虽然简单,但也实用!让我们从最简单的基础排序算法开始,打开我们的算法大门! 排序算法 ...

  • 简单排序(选择排序、起泡排序和插入排序)使用详解

    简单排序算法 简单排序算法是一类算法,指那些直观、易理解的排序算法的总和。 到现在为止,我们已经讲了的三种排序算法...

  • 浅谈排序算法

    排序算法有很多种,今天先谈谈一些简单的排序算法。包括桶排序、冒泡排序和快速排序算法。后期总结各种排序算法。 桶排序...

  • 排序算法(四)选择排序

    排序算法(四)选择排序 1.算法思路  选择排序(Selection-Sort)是一种简单直观的排序算法。它的工作...

  • 2018-04-03 排序算法

    8种排序算法:按照时间复杂度分为两类 简单排序算法:冒泡排序,选择排序,直接插入排序 改进算法:希尔排序,堆排序,...

  • 插入排序算法实现

    排序算法是最常见,最基础的算法,作者文集中记录了两种排序算法(插入排序,归并排序) 插入排序算法实现很简单直接,附...

  • 选择排序算法

    一、选择排序算法 选择排序(Selection sort)是一种简单直观的排序算法。 二、算法思想 每一次从待排序...

  • 经典算法---排序(摘抄)

    一、排序算法 前言:常见排序算法分类 非线性时间比较类排序:交换类排序(快速排序和冒泡排序)、插入类排序(简单插入...

  • 冒泡排序算法

    冒泡排序(Bubble Sort)算法是所有排序算法中最简单、最基本的一种。冒泡排序算法的思路就是交换排序,通过相...

  • 排序基础(一)

    排序算法 O(n2)的排序算法 为什么要学习O(n2)的排序算法? 基础 编码简单,易于实现,是一些简单场景的首选...

网友评论

      本文标题:简单排序算法

      本文链接:https://www.haomeiwen.com/subject/ccpgvxtx.html