C——冒泡排序、快速排序,选择排序

来源:互联网 发布:2017汽车销售数据 编辑:程序博客网 时间:2024/06/13 07:10

在编程中, 排序是数据处理的重要内容。排序的方法有很多种,根据序列的规模以及数据处理的需求,所采用的方法也不同。在这就整理一下简单的三种排序方法。


一、冒泡排序

冒泡排序的原理是:一次比较相邻的两个数,小的放到前面,大的放到后面。
在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。

实现:

void bubble_sort(int arr[], int len){    int i, j;    int tmp;    int flag = 0;    if(len < 1)    {        return;    }    for(i=0; i<len; i++)   /*要排序len次*/    {        for(j=0; j<len-1; j++)   /*每次从头遍历*/        {            if(arr[j] > arr[j+1])    /*比较大小*/            {                swap(&arr[j], &arr[j+1]);   /*交换*/                flag = 1;            }        }        if(0 == flag)            break;    }}

这里设置了一个flag,若一开始这个序列就是有序序列,就不用排了。


二、快速排序

快速排序原理:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。(”二分“的思想)

举例说明:
如无序数组[6 2 4 1 5 9]
a),先把第一项[6]取出来,(通常选用第一个数据)作为关键数据
用[6]依次与其余项进行比较,
如果比[6]小就放[6]前边,2 4 1 5都比[6]小,所以全部放到[6]前边
如果比[6]大就放[6]后边,9比[6]大,放到[6]后边,
一趟排完后变成下边这样:
排序前 6 2 4 1 5 9
排序后 2 4 1 5 6 9

b),对前半部分[2 4 1 5]继续进行快速排序
重复步骤a)后变成下边这样:
排序前 2 4 1 5
排序后 1 2 4 5
前半部分排序完成,总的排序也完成:
排序前:[6 2 4 1 5 9]
排序后:[1 2 4 5 6 9]

实现:

void quick_sort(int *arr, int left, int right){    int i = left;    int j = right;    int key = arr[left];   /*key保存的是基准数*/    if(left >= right)        return;    while(i < j)   /*在组内寻找*/    {        while(i < j && key <= arr[j])  /*要先从后往前找*/        {            j--;  /*往前找*/        }        while(i < j && key >= arr[i])  /*再从前往后找*/        {            i++; /*往后找*/        }        if(i < j)   /*i和j没碰到一起时*/        {            swap(&arr[i], &arr[j]);  /*交换*/        }    }    /*基准数归位*/    arr[left] = arr[i];    arr[i] = key;    quick_sort(arr, left, i-1);  /*递归处理前半部分*/    quick_sort(arr, i+1, right);  /*递归处理后半部分*/}

三、选择排序

选择排序原理:每一次从无序组的数据元素中选出最小(或最大)的一个元素,存放在无序组的起始位置,无序组元素减少,有序组元素增加,直到全部待排序的数据元素排完。
比如:10个数需排9次,按升序排列,第一趟比较:则是将数组的第一个元素与数组中从第二个元素开始到最后的元素进行比较找到最小的数记录下来然后将值赋值给数组的第一个元素,然后进行第二趟比较:则是将数组的第二个元素与数组中从第三个元素开始到最后的元素进行比较,找最小的数记录下来将值赋值给数组的第二个元素。……依次循环。

实现:

void select_sort(int *arr, int len){    int i, j;    int tmp;    int min;    for(i = 0; i < len - 1; i++)    {        min = i;    /*每次都把min置成无序组起始位置元素下标*/        for(j = i; j < len; j++)   /*遍历无序数组,寻找最小值*/        {            if(arr[min] > arr[j])            {                min = j;            }        }        if(min != i)   /*若最小值没在起始位置*/        {            swap(&arr[min], &arr[i]);  /*交换*/        }    }}

完整代码:

/********************************************************************************* *      Copyright:  (C) 2017 TangBin<tangbinmvp@gmail.com> *                  All rights reserved. * *       Filename:  sort.c *    Description:  This file  *                  *        Version:  1.0.0(08/01/2017) *         Author:  TangBin <tangbinmvp@gmail.com> *      ChangeLog:  1, Release initial version on "08/01/2017 01:40:38 PM" *                  ********************************************************************************/#include <stdio.h>#include <stdlib.h>#define LEN(array) ( (sizeof(array))/(sizeof(array[0])) )void swap(int *a, int *b){    int tmp;    tmp = *a;    *a = *b;    *b = tmp;}void bubble_sort(int arr[], int len){    int i, j;    int tmp;    int flag = 0;    if(len < 1)    {        return;    }    for(i=0; i<len; i++)    {        for(j=0; j<len-1; j++)        {            if(arr[j] > arr[j+1])            {                swap(&arr[j], &arr[j+1]);                flag = 1;            }        }        if(0 == flag)            break;    }}void quick_sort(int *arr, int left, int right){    int i = left;    int j = right;    int key = arr[left];    if(left > right)        return;    while(i < j)    {        while(i < j && key <= arr[j])        {            j--;        }        while(i < j && key >= arr[i])        {            i++;        }        if(i < j)        {            swap(&arr[i], &arr[j]);        }    }    arr[left] = arr[i];    arr[i] = key;    quick_sort(arr, left, i-1);    quick_sort(arr, i+1, right);}void select_sort(int *arr, int len){    int i, j;    int tmp;    int min;    for(i = 0; i < len - 1; i++)    {        min = i;        for(j = i; j < len; j++)        {            if(arr[min] > arr[j])            {                min = j;            }        }        if(min != i)        {            swap(&arr[min], &arr[i]);        }    }}int main(){    int arr[] = {8, 3, 7, 1, 8, 10, 9, 100, 78};    //int arr[] = {1, 2, 3, 4, 5, 6};    int i;    //bubble_sort(arr, LEN(arr));    //quick_sort(arr, 0, LEN(arr));    select_sort(arr, LEN(arr));    for(i=0; i<LEN(arr); i++)    {        printf("%-6d", arr[i]);    }    printf("\n");    return 0;}
原创粉丝点击