9.2、排序的基本概念与分类
9.2.0、什么是排序?
9.2.1、排序的稳定性
9.2.2、内排序与外排序
9.2.3、排序用到的结构与函数
#define MAX_SIZE 10 //用于要排序数组个数最大值,可根据需要修改
typedef struct
{
int r[MAX_SIZE + 1]; //用于存储要排序数组,r[0]用作哨兵或临时变量
int length; //用于记录顺序表的长度
}SqList;
//交换L中数组r的下标为i和j的值
void swap( SqList *L, int i, int j )
{
int temp = L->r[i];
L->r[i] = L->r[j];
L->r[j] = temp ;
}
9.3、冒泡排序
9.3.1、最简单排序实现
#include <stdio.h>
void BubbleSort( int k[], int n )
{
int i, j, temp;
int count1 = 0; //计数器
int count2 = 0;
for( i = 0; i < n-1; i++ )
{
for( j = i+1; j < n; j++ )
{
count1++; //每执行一次判断就+1
if( k[i] > k[j] )
{
count2++; //每改变一次位置就+1
temp = k[i];
k[i] = k[j];
k[j] = temp;
}
}
}
printf( "总共进行了%d次比较.\n", count1 );
printf( "总共进行了%d次移动.\n", count2 );
}
int main()
{
int i, a[9] = {9, 1, 5, 8, 3, 7, 4, 6, 2};
BubbleSort( a, 9 );
for( i=0; i<9; i++ )
{
printf( "a[%d] = %d.\n", i, a[i] );
}
}
9.3.2、(正宗)冒泡排序算法
#include <stdio.h>
void BubbleSort( int k[], int n )
{
int i, j, temp;
int count1 = 0; //计数器
int count2 = 0;
for( i = 0; i < n-1; i++ ) //一共比较n-1次
{
for( j = n-1; j > i; j-- ) //从下往上比较,每一次会把最小的移到最恰面
{
count1++; //每执行一次判断就+1
if( k[j-1] > k[j] )
{
count2++; //每改变一次位置就+1
temp = k[j-1];
k[j-1] = k[j];
k[j] = temp;
}
}
}
printf( "总共进行了%d次比较.\n", count1 );
printf( "总共进行了%d次移动.\n", count2 );
}
int main()
{
int i, a[9] = {9, 1, 5, 8, 3, 7, 4, 6, 2};
BubbleSort( a, 9 );
for( i=0; i<9; i++ )
{
printf( "a[%d] = %d.\n", i, a[i] );
}
}
9.3.3、冒泡排序优化
#include <stdio.h>
void BubbleSort( int k[], int n )
{
int i, j, temp;
int flag = 1; //flah用来做标记
int count1 = 0; //计数器
int count2 = 0;
for( i = 0; i < n-1 && flag; i++ ) //若flag为true退出循环
{
for( j = n-1; j > i; j-- ) //从下往上比较,每一次会把最小的移到最恰面
{
count1++; //每执行一次判断就+1
flag = 0; //初始值flag
if( k[j-1] > k[j] )
{
flag = 1; //如果有数据交换,flag为true。
count2++; //每改变一次位置就+1
temp = k[j-1];
k[j-1] = k[j];
k[j] = temp;
}
}
}
printf( "总共进行了%d次比较.\n", count1 );
printf( "总共进行了%d次移动.\n", count2 );
}
int main()
{
int i, a[9] = {2, 1, 3, 4, 5, 6, 7, 8, 9};
BubbleSort( a, 9 );
for( i=0; i<9; i++ )
{
printf( "a[%d] = %d.\n", i, a[i] );
}
}
9.3.4、冒泡排序复杂度分析
9.4、简单选择排序
9.1、简单选择排序算法
#include <stdio.h>
void SelectSort( int k[], int n )
{
int i, j, min, temp;
int count1 = 0; //计数器
int count2 = 0;
for( i=0; i < n-1; i++ )
{
min = i; //将当前下标定义为最小值下标
for( j=i+1; j < n; j++ ) //循环之后的数据
{
count1++; //每执行一次判断就+1
if( k[j] < k[min] ) //如果有小于当前最小值的关键字
{
min = j; //将此关键字的下标赋值给min
}
}
if( min != i ) //若min不等于i,说明找到最小值
{
count2++; //每改变一次位置就+1
temp = k[min]; //交换值
k[min] = k[i];
k[i] = temp;
}
}
printf( "总共进行了%d次比较.\n", count1 );
printf( "总共进行了%d次移动.\n", count2 );
}
int main()
{
int i, a[9] = {9, 1, 5, 8, 3, 7, 4, 6, 2};
SelectSort( a, 9 );
for( i=0; i < 9; i++ )
{
printf( "a[%d] = %d.\n", i, a[i] );
}
}