现在的位置: 首页 > 综合 > 正文

算法篇之排序(一)

2018年09月01日 ⁄ 综合 ⁄ 共 2243字 ⁄ 字号 评论关闭

一、概述

      我们常说的排序就是将一组数据按一定顺序排列起来,以便方便查询和处理。排序大致分为两类:内部排序和外部排序,区别在于是否需要访问外存。这里不展开讲解。

二、常见排序算法

1、冒泡排序法

      博主认为冒泡排序可以算是一种接触地非常频繁的算法。其基本思想是:从后往前进行多次扫描,当发现相邻两个关键字的次序与排序要求不符时,将这两个数据进行位置交换。当然了,说得再多,还不如看个demo来得快。假设现有6个数据,需要将其按从小到大排序。为便于读者理解,直接上代码。

#include <stdio.h>
#include <stdlib.h>

#define ARRAYLENGTH 6 
int main()
{
    int temp;                                                  //temp为临时值 
    int data[ARRAYLENGTH] = {23, 15, 2, 92, 65, 132};          //需要排序的数据
  //int flag = 0;                                              //设置标志flag 
    
    for(int i = 0; i < ARRAYLENGTH - 1; i++)                   //总共6个数据,因此需要5次排序 ,每次冒泡按从后往前的顺序将最小的数据往前推 
    {
            for (int j = ARRAYLENGTH - 1; j >= i; j--)         //将相邻的数据进行,若前一个数据大于后一个就将两个数据交换位置 
            {
                if(data[j-1] > data[j])
                {
                           temp = data[j-1];
                           data[j-1] = data[j];
                           data[j] = temp;
                         //flag = 1;                           //若相邻数据交换位置,则将flag赋值为1 
                }
            }
         //if(flag == 0) break;                                //若flag为0,则跳出排序 
          //else flag = 0;                                      //若flag为1,则将flag重置为0,并继续进行冒泡排序 
    }
    
    for(int i = 0; i < 6; i++)                                 //将得到排好序的数据输出 
    {
            printf("%d ",data[i]);
    }
    system("pause");
    return 0;
}

从上可以看出如果将长度为6的数据组排序需要5次冒泡,但如果两次冒泡后已经按要求排序,剩下的执行将做无用功。如何解决这个问题呢?我们可以加入一个初始值为0的标志flag。每次冒泡后,如有顺序改动将flag赋值为1。在执行完内循环后进行判断flag的值,若为1,则跳出循环。

2、快速排序法

      快速排序法是一种对冒泡排序的改进。其基本思想:第一遍排序时,将数据组分为两组,一组比标准值大,一组比标准值小。再对这两组数据分别进行快速排序。这里涉及到了递归的概念。不多说,上代码。

#include <stdio.h>
#include <stdlib.h>

#define ARRAYLENGTH 6

int Division(int a[], int left, int right)
{
    int base = a[left];                                         //设置基准值base为最左边的数 
    while(left < right)
    {
               while((left < right) && (a[right] > base))       //从右向左寻找第一个小于基准值的数 
               right--;
               a[left] = a[right];                              //将该数移到最左边 
               while((left < right) && (a[left] < base))        //从左向右寻找第一个大于基准值的数 
               left++;
               a[right] = a[left];                              //将该数移到最右边 
    }
    a[left] = base;                                             //将最小值设为基准 
    return left;                                                //返回最小值的位置 
}

void QuickSort(int a[], int left, int right)                     //快速排序 
{
     int i; 
     if(left < right)
     {
             i = Division(a,left,right);                        //分割数据 
             QuickSort(a,left,i-1);
             QuickSort(a,i+1,right);
     }
} 

int main()
{
    int temp;                                                  //temp为临时值 
    int data[ARRAYLENGTH] = {23, 15, 2, 92, 65, 132};          //需要排序的数据
    
    QuickSort(data,0,ARRAYLENGTH-1);                            //进行快速排序 
    
    for(int i = 0; i < 6; i++)                                 //将得到排好序的数据输出 
    {
            printf("%d ",data[i]);
    }
    system("pause");
    return 0;
}

3、简单选择排序法

        简单选择排序,顾名思义,每一次排序,选择最小的数据输出。博主认为这比较符合人类的思想。举个简单的demo。

#include <stdio.h>
#include <stdlib.h>

#define ARRAYLENGTH 6

void SelectSort(int a[],int n)                                //简单选择排序 
{
     int i,j,k,temp;
     for(i = 0; i < n-1; i++)
     {
           k = i;
           for(j=i+1; j<n; j++)
           if(a[k] > a[j]) k = j;                             //找出最小值的位置 
           temp = a[i];
           a[i] = a[k];
           a[k] = temp;
     }
}

int main()
{
    int temp;                                                  //temp为临时值 
    int data[ARRAYLENGTH] = {23, 15, 2, 92, 65, 132};          //需要排序的数据
    
    SelectSort(data, ARRAYLENGTH);                             //简单选择排序 
    
    for(int i = 0; i < 6; i++)                                 //将得到排好序的数据输出 
    {
            printf("%d ",data[i]);
    }
    system("pause");
    return 0;
}

本文暂时写到这里,在下一篇文章中,博主将讲述堆排序、直接插入排序、希尔排序、合并排序。

【上篇】
【下篇】

抱歉!评论已关闭.