冒泡排序
原理:通过前后交换和比较无序序列中的最大或最小元素移动到无序序列的一端,然后继续在除去最大或最小元素的无序序列重复刚才的过程。
冒泡排序的一般版本:
void swap(int *a,int *b)
{
int t;
t = *a;
*a = *b;
*b = t;
}
void bubbleSort(int arr[],int left,int right)
{
int i,j;
for (i=1;i<right-left+1;i++)
for (j=left;j<right-i+1;j++)
{
if(arr[j]>arr[j+1]) swap(arr+j,arr+j+1);
}
}
若在一趟排序过程没有发生两两交换,那么此序列已经有序,可以设置标志位表示该状态及早退出循环。
冒泡排序的优化版本:
enum BOOL {FALSE,TRUE};
void swap(int *a,int *b)
{
int t;
t = *a;
*a = *b;
*b = t;
}
void bubbleSort2(int arr[],int left,int right)
{
int i,j;
BOOL ischanged;
for (i=1;i<right-left+1;i++)
{
ischanged = FALSE;
for (j=left;j<right-i+1;j++)
{
if(arr[j]>arr[j+1]) {
swap(arr+j,arr+j+1);
ischanged = TRUE;
}
}
if(!ischanged)
break;
}
}
选择排序
原理:在一趟排序过程中选择无序序列的最大(最小值)插入无序序列的一端,缩小无序序列的范围,继续之前的过程。
void selectSort(int arr[],int left,int right)
{
int i,j,minPos;
for(i=left;i<right;i++)
{
minPos = i;
for (j=i+1;j<=right;j++)
{
if(arr[j]<arr[minPos]) minPos = j;
}
if(minPos!=i) swap(arr+i,arr+minPos);
}
}
插入排序
原理:将整个序列分成无序序列和有序序列两个部分,每轮循环过程中将无序序列的首元素插入有序序列的合适位置,重复之前的过程。
插入排序的一般版本:
void insertSort(int arr[],int left,int right)
{
int i,j;
int temp;
for(int i=left+1;i<=right;i++)
{
temp = arr[i];
for(j=i-1;j>=left && temp<arr[j];j--)
{
arr[j+1] = arr[j];
}
arr[j+1] = temp;
}
}