目录

一、排序算法介绍

二、算法代码实现

1、选择法排序

2、冒泡法排序

3、交换法排序

4、插入法排序

5、折半法排序


一、排序算法介绍

1、选择法排序

选择法排序在排序过程中一共需要进行 n(n-1)/2 次比较,互相交换 n-1 次。选择法排序简单、容易实现,适用于数量较小的排序。

2、冒泡法排序

最好的情况是正序,因此只要比较一次即可;最坏的情况是逆序,需要比较 n*n 次。冒泡法排序是稳定的排序方法,当待排序列有序时,效果比较好。

3、交换法排序

交换法排序和冒泡法排序类似,正序时最快,逆序时最慢,排列有序数据时效果最好。

4、插入法排序

插入法排序需要经过 n-1 次插入过程,如果数据恰好应该插入到序列的最后端,则不需要移动数据,可节省时间。因此,若原始数据基本有序,此算法具有较快的运算速度。

5、折半法排序

折半法排序对于较大的 n 时,是速度最快的排序算法;当时当 n 很小时,此方法往往比其他排序算法还要慢。折半法排序是不稳定的,对应有相同关键字的记录,排序后的结果可能会颠倒次序。

以上5种排序算法:插入法、冒泡法、交换法排序的速度较慢,但参加排序的序列局部或整体有序时,这种排序能打到较快的速度;当 n 较小时,对稳定性不做要求时,宜选用选择法排序;对稳定性有要求时,宜选用插入法或者冒泡法排序

二、算法代码实现

1、选择法排序

(1)选择法排序是指 每次选择所要排序的数组中的最大值(最小值)的数组元素,将这个数组元素与最前边没有进行排序的数组元素的值互换。

(2)每次都将下一个数字和剩余数字中的最小数字进行位置互换,直到将一组数字按从小到大排序。

(3) 排序的比较次数:n(n-1)/2,每次循环选出最大(最小)值,并交换位置。

#include<stdio.h>
int main()
{int i,j;                                        // 存储数值最小的数组元素的数值和该元素的位置int a[10];                                      // 存储输入的数据int iTemp;int iPos;printf("为数组元素赋值: \n");// 从键盘为数组元素赋值for(i=0; i<10; i++){printf("a[%d] = ",i);scanf("%d",&a[i]);}// 从小到大排序for(i=0; i<9; i++)                              // 设置外层循环为下标 0~8 的元素{iTemp = a[i];                               // 设置当前元素的最小值iPos = i;                                   // 记录当前元素的位置for(j=i+1; j<10; j++)                       // 设置内层循环为 i+1 ~ 9{if(a[j] < iTemp)                        // 如果当前元素比最小值还小{iTemp = a[j];                       // 重新设置最小值iPos = j;                           // 记录新的元素位置}}// 交换两个元素值a[iPos] = a[i];a[i] = iTemp;}// 输出数组for(i=0; i<10; i++){printf("%d\t",a[i]);                        // 输出制表符if(i == 4)                                  // 如果是第五个元素,则换行,方便查看{printf("\n");}}return 0;
}

2、冒泡法排序

(1)冒泡法排序是指 每次比较数组中相邻的两个数组元素的值,将较小的数排在较大的数前面(从小到大排列)。

(2)第一次排序过程中将最小的数字移动到第一的位置,并将其他数字依次向后移动。

(3)每次都将剩余数字中的最小数字移动到当前剩余数字的最前方,直到将一组数字按从小到大的排序为止。

#include<iostream.h>
int main()
{int i,j;int a[10];                                      // 声明一个整形数组int iTemp;printf("为数组元素赋值:\n");// 通过键盘为数组元素赋值for(i=0; i<10; i++){printf("a[%d]=",i);scanf("%d",&a[i]);}// 从小到大排序for(i=1; i<10; i++)                             // 外层循环元素下标为1~9{for(j=9; j>=i; j--)                         // 内层循环元素下标为i~9{if(a[i] < a[j-1])                       // 如果前一个数比后一个数大,交换数据{iTemp = a[j-1];a[j-1] = a[j];a[j] = iTemp;}}}// 输出数组for(i=0; i<10; i++){printf("%d\t",a[i]);if(i == 4){printf("\n");}}return 0;
}

3、交换法排序

(1)交换法排序是指 将每一位数字与其后的所有数一一进行比较,如果发现符合条件的的数据则交换数据。

(2)首先,用第一个数依次与其后的所有数字进行比较,如果存在比其值大(小)的数,则交换这两个数后,继续向后比较其他数,直到最后一个数。

(3)如果遇到比当前数字小的数则交换位置,依次类推,直到将一组数字按照从小到大排序为止。

#include<stdio.h>
int main()
{int i,j;int a[10];int iTemp;printf("请为数组元素赋值:\n");// 通过键盘为数组元素赋值for(i=0; i<10; i++)                             // 为元素循环赋值{printf("a[%d]= ",i);scanf("%d",&a[i]);}// 从小到大排序for(i=0; i<9; i++)                              // 外层循环元素下标为 0~8{for(j=i+1; j<10; j++)                       // 内层循环元素下标为 i+1到9{if(a[j] < a[i])                         // 如果当前值比其他值大{iTemp = a[i];                       // 交换两个数值a[i] = a[j];a[j] = iTemp;}}}// 输出数组for(i=0; i<10; i++){printf("%d\t",a[i]);if(i == 4){printf("\n");}}return 0;
}

4、插入法排序

(1)插入法排序是指 抽出一个数据,在前面的数据中寻找相应的位置插入,然后继续下一个数据,直到完成排序。

(2)第一次排序时将第一个数字取出,放在第一的位置;然后进行第二次排序,先取出第二个数字,与第一个进行比较,如果小则插入在前,如果大则插入在后。

(3)不断取出未进行排序的数字与排序好的数字进行比较,(先与排在后的面的数字进行比较),并插入到相应的位置,直到完成排序。

#include<stdio.h>
int main()
{int i;                                          int a[10];                                      // 存储用户输入的数字int iTemp;                                      // 存储两个元素交换时的中间变量和记录元素位置int iPos;printf("请为数组元素赋值:\n");// 通过键盘为数组元素赋值for(i=0; i<10; i++)                             // 为元素循环赋值{printf("a[%d]= ",i);scanf("%d",&a[i]);}// 从小到大排序for(i=0; i<10; i++)                             // 循环数组中的元素{iTemp = a[i];                               // 设置插入值iPos = i-1;while((iPos >= 0) && (iTemp < a[iPos]))     // 寻找插入值的位置{a[iPos+1] = a[iPos];                // 插入数值iPos--;}a[iPos+1] = iTemp;}// 输出数组for(i=0; i<10; i++){printf("%d\t",a[i]);if(i == 4){printf("\n");}}return 0;
}

5、折半法排序

(1)折半法排序又称为快速法排序,是指 选择一个中间值 middle(在程序中使用数组的中间值),然后把比中间值小的数据放在左边,比中间值大的数据放在右边。

(2)第一次比较完成后分别对中间值两边的数据进行递归比较,直到将一组数字按照从小到大排序为止。

1)在第一次排序中,首先取中间值,从左右两侧分别取出数据与中间值进行比较:

2)(左侧比较从第一个元素开始)   当左侧取出的数据比中间值大时,则交换两个互相比较的数组元素值;

3)(右侧比较从最后一个元素开始) 当右侧取出的数据比中间值大时,取前一个数组元素的值继续与中间值进行比较,如果右侧这个值比中间值小,则交换位置。

4)当中间值两侧的数据都比较一遍以后,数组以第一个元素为起点,以中间值的元素为终点,按照上面的方法继续进行比较;

5)右侧以中间值为起点,数组最后一个元素为终点,按照上述方法继续比较。

#include<stdio.h>// 声明一个排序函数
void CelerityRun(int left, int right, int array[]);int main()
{int i;int a[10];printf("为数组元素赋值:\n");// 通过键盘为数组元素赋值for(i=0; i<10; i++){printf("a[%d]=",i);scanf("%d",&a[i]);}// 从小到大排序函数CelerityRun(0,9,a);// 输出数组for(i=0; i<10; i++){printf("%d\t",a[i]);                        // 输出制表符if(i == 4)                                  // 如果是第五个元素,则换行,方便查看{printf("\n");}}return 0;
}// 排序函数功能实现
void CelerityRun(int left, int right, int array[])
{int i,j;int middle,iTemp;i = left;j = right;middle = array[(left + right)/2];               // 求中间值do{while((array[i] < middle) && (i < right))   // 第一个内层循环,从最左边开始找小于中间值的数,如果找到大于中间值的数结束{i++;                                    // 左侧数组的值分别与中间值比较一次,找打大于中间值的数结束左侧循环}while((array[j] > middle) && (j > left))    // 第二个内层循环,从最右边开始找大于中间值的数,如果找到小于中间值的数结束{j++;}if(i <= j)                                  // 找到了一对值,进行数值交换{iTemp = array[i];array[i] = array[j];array[j] = iTemp;i++;j--;}} while (i <= j);                               // do-while 设计外层循环,如果两边的下标交错(保证左右两边的数都与中间值比较了一次),就停止循环(完成一次排序)// 递归排序左边的数据if(left < j){CelerityRun(left,j,array);}// 递归排序右边的数据if(right > i){CelerityRun(right,i,array);}
}

数组的常用五种排序算法相关推荐

  1. JavaScript实现五种排序算法

    最近复习一些数据结构的算法,想着既然弄熟了JavaScript,倒不如用JavaScript来实现一下. 在数据结构中的排序算法中,大致可以分为五类:快速排序.插入排序.选择排序.归并排序.基数排序. ...

  2. 五种排序算法 -- Python语言实现

    交换两项位置方法: # -*- coding: utf-8 -*- def swap(lyst, i, j):temp = lyst[i]lyst[i] = lyst[j]lyst[j] = temp ...

  3. Shell脚本:数组(穿插四种排序算法)

    目 录 一.认识Shell数组 ①数组的定义方法 ②获取数组长度 ③获取数据列表 ④读取某下表赋值 ⑤数组遍历 ⑥数组切片 ⑦数组替换 ⑦数组删除 ⑧数组追加元素 函数与数组 ①从函数返回数组 ②数组 ...

  4. php常用的四种排序算法

    纯当练习,高手请绕过.以一维数组为例. 1.插入排序 思想: 每次将一个待排序的数据元素插入到前面已经排好序的数列中,使数列依然有序,知道待排序数据元素全部插入完为止. 示例: [初始关键字] [49 ...

  5. java中常用的几种排序算法--常见笔试面试

    转载:http://blog.csdn.net/ygc87/article/details/7208082 以下列出Java中常用的几种排序算法,只是简单实现了排序的功能,还有待改进,望指教(以下均假 ...

  6. 对以下6种常用的内部排序算法进行比较:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序。

    题目要求: (1)对以下6种常用的内部排序算法进行比较:起泡排序.直接插入排序.简单选择排序.快速排序.希尔排序.堆排序. (2)待排序表的表长不小于100:其中的数据要用伪随机数产生程序产生:至少要 ...

  7. Java常用的八种排序算法与代码实现

    在Java的时候,对于排序的应用需要熟练的掌握,这样才能够确保Java学习时候能够有扎实的基础能力.那Java有哪些排序算法呢?本文小千就来详细说说Java经典的8种排序算法. 经典的排序算法有八种, ...

  8. C语言常用8种排序方法耗时测试

    最近项目中用到排序算法,于是研究了一下常用的8种排序算法.由于是在8位单片机上使用,所以对内存和时间要求比较高,最好是不额外占空间,同时耗时较短.于是对常用的8中算法耗时做了个测试.通过LED的亮灭来 ...

  9. 常见的五种排序,冒泡排序,选择排序,插入排序,并归排序,快速排序

    冒泡排序 冒泡排序介绍: 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 它重复地跑过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小)那么它就会按照大到小的 ...

最新文章

  1. zabbix监控平台添加服务(http,nginx,mysql)
  2. 不修条地铁,都不好意思叫自己大城市
  3. Android技术专家 高焕堂 推荐这本书
  4. 实验7 OpenGL光照
  5. 移动办公OA系统选型的任何疑问,这篇文章帮您搞定!
  6. 伪原创工具哪个好用,自媒体伪原创文章生成器软件
  7. SPSS实现两独立样本非参数检验
  8. WORD中如何调整字间距
  9. 【MOOC】华中科技大学操作系统慕课答案-期末测试题
  10. C++编码规范与指导
  11. 项目管理学习总结(20)——小团队管理与大团队管理
  12. 个人作业4 结对开发地铁
  13. 使用Tensorflow Object Detection API对集装箱号进行OCR识别
  14. win10蓝屏修复之死路一条
  15. 大一寒假培训(三)——暴力枚举及妙用
  16. centos离线安装fastdfs
  17. 遗传算法中交叉方法简介及基于适应度的启发式多点交叉
  18. 基于python的微信机器人开发_python 微信机器人
  19. 不协调的世界(3)-高速公路
  20. Agilent/安捷伦3458A八位半万用表

热门文章

  1. python excel格式刷_Excel格式刷怎么用?没你想的那么简单,你知道几种用法?
  2. PTA 题目详情 - 7-43 快速求和(误差修正版).html
  3. List 转 Array数组
  4. lisp xy轴不等比缩放_CAD中如何进行X、Y两个轴向不等比例缩放图形?【AutoCAD教程】...
  5. 饥荒 搜不到指定服务器,运行饥荒就直连特定服务器,无需搜索房间名方法图文教程...
  6. 计算机怎么更改桌面图标大小,win7系统桌面图标怎么设置大小 win7电脑桌面图标大小更改方法...
  7. NO.1经典电影台词精选(转载)
  8. 处理 CAD 打开文件时 不显示对话框
  9. 2021年,入局直播电商是最好的时机吗?
  10. python字符串下标截取_python 用下标截取字符串的实例