各种排序算法总结(基于数组)

写代码前,将这些算法分步骤建立模型,代码就好写了

1、冒泡排序

冒泡排序是非常容易理解和实现,以从小到大排序举例:

设数组长度为N。

  1. 比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。
  2. 这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。
  3. N=N-1,如果N不为0就重复前面二步,否则排序完成。

  

void _swap(int *a, int *b)
{
    int temp;

    temp = *a;
    *a = *b;
    *b = temp;
}

void BubbleSort(int a[],int n)
{
    assert(a != NULL);
    assert(n > 0);

    int i, j;
    int flag = 0;
    for(i = 0; i < n-1; i++)
    {
        for(j = 0; j < n-i-1; j++)
        {
            if(a[j+1] < a[j])
            {
                _swap(a+j+1, a+j);
                flag = 1;
            }
        }
        if(flag == 0)
            break;
    }

}

  冒泡排序基本就是,两两相邻的比较,满足条件交换,经过一轮使得最大的数沉到最后,循环n-1轮,排序完成。

2、选择排序

设数组为a[0…n-1]。

  1. 初始时,数组全为无序区为a[0..n-1]。令i=0
  2. 在无序区a[i…n-1]中选取一个最小的元素,将其与a[i]交换。交换之后a[0…i]就形成了一个有序区。
  3. i++并重复第二步直到i==n-1。排序完成。
 1 void SelectSort(int a[], int n)
 2 {
 3     assert(a != NULL);
 4     assert(n > 0);
 5
 6     int i, j;
 7     for(i = 0; i < n-1; i++)
 8     {
 9         int nMinIndex = i;
10         for(j = i; j < n-1; j++)
11         {
12             if(a[j+1] < a[nMinIndex] )
13             {
14                 nMinIndex = j+1;
15             }
16         }
17         if(i != nMinIndex)
18         {
19             _swap(a+i, a+nMinIndex);
20         }
21     }
22 }

  选择排序就是将待排序的元素分为无序区和有序区,从无序区选取最小的元素插入有序区的最后,循环n-1轮,排序完成。

3、插入排序

  插入排序和选择排序类似,都将数据分为有序区和无序区,所不同的是插入排序是将无序区的第一个元素直接插入到有序区以形成一个更大的有序区,而直接选择排序是从无序区选一个最小的元素直接放到有序区的最后。

设数组为a[0…n-1]。

  1. 初始时,a[0]自成1个有序区,无序区为a[1..n-1]。令i=1
  2. 将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间。
  3. i++并重复第二步直到i==n-1。排序完成。
 1 void InsertSort(int a[], int n)
 2 {
 3     assert(a != NULL);
 4     assert(n > 0);
 5
 6     int i,j;
 7
 8     for(i = 1; i < n; i++)
 9     {
10
11         for(j = 0; j < i; j++)
12         {
13             if(a[i] < a[j])
14             {
15                 break;
16             }
17         }
18         int insertIndex = j;
19         int tmp = a[i];
20         for(j = i-1; j >= insertIndex; j--)
21         {
22             a[j+1] = a[j];
23         }
24         a[insertIndex] = tmp;
25     }
26 }

  选择排序就是将待排序的元素分为无序区和有序区,将无序区第一个元素插入到有序区中,循环n-2轮,排序完成。

时间: 2024-10-09 10:04:38

各种排序算法总结(基于数组)的相关文章

js多个(N)个数组的的元素组合排序算法,多维数组的排列组合或多个数组之间的排列组合

现在有一批手机,其中颜色有['白色','黑色','金色','粉红色']:内存大小有['16G','32G','64G','128G'],版本有['移动','联通','电信'],要求写一个算法,实现[['白色','16G','移动'], ['白色','16G','联通'] ...]这样的组合,扩张,如果后面还有参数,比如再加一个['国行','港版','美版'],不改程序一样可以执行! 通过上面规律可以发现这个算法就是:一个数组里面包含若干个数组,进行组合 算法代码写法一: // 执行组合排列的函数

排序算法----快速排序(数组形式)

这个快速排序主要利用递归调用,数组存储方式.包含3个文件,头文件QuickSort.h,库函数QuickSort.c,测试文件TestQuickSort. 其中Cutoff可以自己给定,这个当开始给定的数组(或者递归调用产生的子数组)的元素个数<=20个时,采用插入排序.一般认为当元素个数<=20时,插入排序更快.这个20不是固定的,在这附近浮动都可以的. 头文件QuickSort.h 1 #ifndef QuickSort_H 2 #define QuickSort_H 3 #define

排序算法比较及其应用

一.将各种数据排序 只要实现了Comparable接口的数据类型就可以被排序. 但要使算法能够灵活地用不同字段进行排序,则是后续需要考虑的问题. 1.指针排序 在Java中,指针操作是隐式的,排序算法操作的总是数据引用,而不是数据本身. 2.键不可变 如果在排序后,用例还可以改变键值,那么数组很可能就不是有序的了.类似,优先队列也会乱套. Java中,可以用不可变数据类型作为键来避免这个问题,如String,Integer,Double和File都是不可变的. 3.廉价交换 使用引用的另一个好处

九大排序算法Java实现

之前学习数据结构与算法时花了三天时间整理九大排序算法,并采用Java语言来实现,今天第一次写博客,刚好可以把这些东西从总结的文档中拿出来与大家分享一下,同时作为自己以后的备忘录. 1.排序算法时间复杂度.稳定性分类: 2.排序算法问题描述与实现 2.1冒泡排序(交换排序-稳定) [问题描述]对于一个int数组,请编写一个冒泡排序算法,对数组元素排序. 问题分析:冒泡排序,顾名思义,从前往后遍历,每次遍历在末尾固定一个最大值. 易错点:每次内层循环结束都会在末尾确定一个元素的位置,因此内层循环的判

普林斯顿公开课 算法3-7:排序算法复杂度

算法复杂度用来表示在解决某个问题时,算法的性能表现. 复杂度上限,就是某个具体的已经实现的算法能够保证在一定时间内解决问题 复杂度下限,就是通过数学方法证明,所有的算法都必须花费一定的时间才能解决问题 最优化算法,就是可能达到的最小复杂度的算法,通常介于复杂度上限和下限之间 比如排序问题中: 计算模型为决策树 使用比较次数作为开销依据 复杂度上限:使用归并排序可以达到N lgN复杂度 复杂度下限:? 最优化算法:? 决策树举例 有三个不同的元素a b c,通过比较的方式来得出排序结果.那么它的决

聊一聊排序算法

聊一聊排序算法 原创 2016-08-11 Barret李靖 两月前花了些时间,将大学里学过的排序算法都复习了一遍,代码放在 github 上,没有整理.今天翻了翻代码,重新 review 了一遍,也顺便做了点记录. 下面花了不少篇幅,将基础排序.希尔.归并.快排.堆排序等都介绍了一通,懒得思考的同学可以略过代码直接看文字,文章对排序的基本思路都做了介绍. 本文的代码可以在这里找到:https://github.com/barretlee/algorithms 三种基本排序 插入排序和选择排序是

Java实现八大排序算法

本文对常见的排序算法进行了总结. 常见排序算法如下: 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 它们都属于内部排序,也就是只考虑数据量较小仅需要使用内存的排序算法,他们之间关系如下: 稳定与非稳定: 如果一个排序算法能够保留数组中重复元素的相对位置则可以被称为是 稳定 的.反之,则是 非稳定 的. 直接插入排序 基本思想 通常人们整理桥牌的方法是一张一张的来,将每一张牌插入到其他已经有序的牌中的适当位置.在计算机的实现中,为了要给插入的元素腾出空间,我

动画 | 大学四年结束之前必须透彻的排序算法

目录 如何分析一个"排序算法"? 开始分析冒泡"排序算法" 开始分析"插入排序算法" 开始分析"选择排序算法" 开始分析"希尔排序算法" 开始分析"快速排序算法" 开始分析"并归排序算法" 开始分析"基数排序算法" 开始分析"堆排序算法" 为什么插入排序要比冒泡排序更受欢迎? 现如今大学生学习排序算法,除了学习它的算法原理.代码

选择排序 —— 排序算法系列

假设我们有如下一个数组: 使用选择排序算法对这个数组进行排序,步骤如下: 第 1 次 在下标0到6之间找到最小的数字,我们可以发现最小的数字是15,它在下标为4的位置上: 把下标4上面的数字跟下标0上面的数字互换,得到排序如下图的数组: 第 2 次 在下标1到6之间找到最小的数字,我们可以发现最小的数字是33,它在下标为5的位置上: 把下标5上面的数字跟下标1上面的数字互换,得到排序如下图的数组: 第 3 次 在下标2到6之间找到最小的数字,我们可以发现最小的数字是48,它在下标为5的位置上: