C语言常见的排序方法——冒泡法、选择法、插入法

当我们要对C中一组数据进行排序是常见的排序方法有冒泡法、选择法、插入法

冒泡排序法(升序):假设一组数据a[0]、a[1]、a[2]、a[3]...a[n],第一轮:先比较a[0]与a[1]、a[1]与a[2]...a[i]与a[i+1]...a[n-1]与a[n]的大小,如果a[i]与a[i+1]不是升序(即a[i] > a[i+1]),那么就将a[i]与a[i+1]的值互换,第一轮过后,a[n]就是最大值;第二轮:运用第一轮同样的方法,比较a[0]与a[1]、a[1]与a[2]...a[i]与a[i+1]...a[n-2]与a[n-1],a[n-1]就是剩下的中最大;以此类推,n-1轮过后,数组的顺序就是按照升序排列的

 1 int bubbleSort(int array[],int n){
 2      int temp; //中间变量
 3
 4      for(int i = 0; i < n - 1; i++){
 5          for(int j = 0;j < 9 - i;j++){
 6              // 如果相邻的两个元素不是升序,则交换两个元素的值
 7              if (array[j] > array[j + 1]) {
 8                  temp = array[j];
 9                  array[j] = array[j + 1];
10                  array[j + 1] = temp;
11              }
12          }
13      }
14
15  }

冒泡法示意图(5个元素的数组):

选择排序法(升序):假设一组数据a[0]、a[1]、a[2]、a[3]...a[n],第一轮:将a[0]的值与其后面每一个数进行比较,若a[0]大,互换两数的值,否则不动,第一轮过后,a[0]的值就是数组中最小的;第二轮:将a[1]与其后面的每一个数进行跟第一轮相同的比较,此轮过后a[1]的值就是剩下的最小的值;以此类推,n-1轮过后,数组的顺序就是按照升序排列的

 1 void selectSort(int array[], int n){
 2      int temp;
 3
 4      for (int i = 0; i < n -1; i++) {
 5          for (int j = i + 1; j <n; j++) {
 6
 7              if (array[i] > array[j]) {
 8                  temp = array[j];
 9                 array[j] = array[i];
10                  array[i] = temp;
11
12              }
13          }
14      }
15 }

上述代码中由于是遇到array[i] > array[j],就交换两者的数值,这样做一旦遇到大点的数据,就会降低排序的效率,在每一轮中我可以将最小数的小标记录下来最后再与a[i]进行互换,这样就会大大提升排序的效率,代码如下:

 1 void selectSort(int array[], int n){
 2     int min,temp;
 3
 4     for (int i = 0; i < n -1; i++) {
 5         min = i; //假设下标i的元素值最小
 6         for (int j = i + 1; j <n; j++) {
 7             //循环把比array[min]数值小的元素下标赋值给min
 8             if (array[min] > array[j]) {
 9                 min = j;
10
11             }
12         }
13         //内循环结束后将最小数array[min]和a[i]互换
14         if(i != min){
15             temp = array[min];
16             array[min] = array[i];
17             array[i] = temp;
18         }
19     }
20 }

选择法示意图:(5个元素的数组)

插入排序法(升序):又称直接插入排序,法这种排序的思路是逐个将无序的数组中元素放到有序数组中的正确的位置。假设一组数据a[0]、a[1]、a[2]、a[3]...a[n],第一轮:把a[0]看做有序的单元素数组,将a[1]放入合适的位置,这样a[0]、a[1]就是一个新的有序数组;第二轮:将a[2]放入有序的数组中合适的位置,这样a[0]、a[1]、a[2]就是新的有序数组,以此类推,最后经过n-1轮的插入,数组的顺序就是按照升序排列的

 1 int insertSort(int array[],int n){
 2     for(int i = 1;i < n;i++) //外部循环,从第二个数开始到最后一个数进行n-1次插入
 3     {
 4         temp = array[i]; //需要插入的数赋值给变量temp
 5         for(int j = i-1; j >= 0&&t < array[j]; j--) //内部循环,将需要插入的数与其前面的数逐个递减比较
 6             array[j + 1] = array[j]; //进入循环说明当前值比插入的数大,此时将当前值往后移一位
 7         array[j+1] = temp; //跳出内部循环说明当前值比插入的数小,此时将要插入的数赋值给前面的数
 8
 9     }
10 }

插入法示意图(升序):

注:关于不同C排序方法的优缺点以及其他方法可阅读C语言中文网或参照百度文库地址为:

http://wenku.baidu.com/view/c3054c0f7cd184254b353516.html

时间: 2024-08-08 01:26:10

C语言常见的排序方法——冒泡法、选择法、插入法的相关文章

C语言中常见的排序方法

在C语言中,常见的排序方法有冒泡法,排序法,插入法等等.所谓的冒泡法,就是对一组数字进行从大到小或者从小到大的一种排序方法.主要就是相邻的数值相互交换.从第一个数值开始,如果这相邻的两个数值排序与我们希望的排序位置不同时,那么就将两个数的位置进行交换.如果一致,就不用交换.一直重复这个过程,直到没有数值需要交换为止,则排序完成.下面是将10个学生的成绩用冒泡法按顺序排列的做法: 1 #include<stdio.h> 2 int main() 3 { 4 int i; 5 int arr[10

常见的排序方法

常见经典排序算法 1.希尔排序 2.二分插入法 3.直接插入法 4.带哨兵的直接排序法 5.冒泡排序 6.选择排序 7.快速排序 8.堆排序 一.希尔(Shell)排序法(又称宿小增量排序,是1959年由D.L.Shell提出来的) /* Shell 排序法 */ #include <stdio.h> void sort(int v[],int n) { int gap,i,j,temp; for(gap=n/2;gap>0;gap /= 2) /* 设置排序的步长,步长gap每次减半,

排序算法之简单排序(冒泡、选择、插入)

1.基本概念 内部排序和外部排序 根据排序过程中,待排序的数据是否全部被放在内存中,分为两大类: 内部排序:指的是待排序的数据存放在计算机内存中进行的排序过程: 外部排序:指的是排序中要对外存储器进行访问的排序过程. 内部排序是排序的基础,在内部排序中,根据排序过程中所依据的原则可以将它们分为5类:插入排序.交换排序.选择排序.归并排序:根据排序过程的时间复杂度来分,可以分为简单排序.先进排序.冒泡排序.简单选择排序.直接插入排序就是简单排序算法. 评价排序算法优劣的标准主要是两条:一是算法的运

C语言中的排序算法--冒泡排序,选择排序,希尔排序

冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端 维基百科:点击打开链接 [cpp] view plain copy /* 用选择法对10个数进行排序 */ #include<stdio.h> void main() { int i,j,

各种常见的排序,冒泡排序,选择排序,插入排序,希尔排序,堆排序,快速排序,基数排序,桶排序

各种常见的排序 要开始找工作了,把以前学的各种小知识复习一遍,以下是各种常见的排序的简单实现(冒泡排序,选择排序,插入排序,希尔排序,堆排序,快速排序,基数排序,桶排序),至于原理就不写出来了,代码比较简单,看一下就懂,再不行可以随意找本书或百度! #include <iostream> using namespace std; // 冒泡 void BubbleSort(int data[], int length) { if(data == NULL || length <= 0)

基础排序算法—冒泡,插入,选择

前言 冒泡,插入,选择这三种基础的排序算法,比较简单效率不高,工作中一般不会使用,但是当做算法来研究还是能了解一些知识的,本文以<数据结构与算法之美>为基础,详细解析一下. 正文 首先要引入几个概念 稳定性 如果待排序数组中有相同的元素,排序过后它们的相对顺序不发生变化. 比如 2,9,3,4,8,3 排序过后为2, 3 , 3, 4, 8, 9 这两个3的相对顺序不变.这样就是具有稳定性. 稳定性可以保证复杂数据结构排序时的相对有序性. 比如我们要对一笔订单先按金额排列,金额相同的再按时间排

几种常见的排序方法(C语言实现)

#include <stdio.h> #include <stdlib.h> #include <Windows.h> //直接插入排序 void InsertSort(int arry[], int n) { int i, j; int temp;//临时变量 for (i = 1; i < n; i++) { temp = arry[i]; for (j = i - 1; j >= 0; j--) { if (temp > arry[j]) bre

24.C语言最全排序方法小结(不断更新)

希尔排序: 该方法的基本思想是:先将整个待排元素序列切割成若干个子序列(由相隔某个"增量"的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序. 由于直接插入排序在元素基本有序的情况下(接近最好情况),效率是非常高的,因此希尔排序在时间效率上比前两种方法有较大提高. 以n=10的一个数组49, 38, 65, 97, 26, 13, 27, 49, 55, 4为例 第一次 gap = 10 / 2

简单数值排序算法 冒泡、选择、 直接插入排序

1. 选择排序法 找到第一小的数字,放在第一個位置:再找到第二小的数字,放在第二個位置 依次找到每次遍历的最小的值.一次找一個数字,如此下去就会把所有数值按照 順序排好.注意,与冒泡不同,遍历的过程中并不交换数值.一次遍历结束才交换. package com.sphere.algorith.design; import java.util.Arrays; public class Test { public static void main(String[] args) { int[] arr