一、概述
我们常说的排序就是将一组数据按一定顺序排列起来,以便方便查询和处理。排序大致分为两类:内部排序和外部排序,区别在于是否需要访问外存。这里不展开讲解。
二、常见排序算法
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; }
本文暂时写到这里,在下一篇文章中,博主将讲述堆排序、直接插入排序、希尔排序、合并排序。