排序算法

来源:互联网 发布:自动化软件开发工程师 编辑:程序博客网 时间:2024/06/10 08:56

1. 选择排序: 有i个元素,每一趟从i-1个待拍元素中选出关键字最小的元素,作为有序元素的第i个元素

例如:

#include <stdio.h>


void swap(int *a, int *b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}


void selectsort(int *a, int len)
{
int i,j;
int min = -1;
for(i = 0; i < len; i++)
{
min = i;
for(j = i; j < len; j++)
{
if(a[j] < a[min])
min = j;
}
swap(&a[i], &a[min]);
}


}


void show(int *a, int len)
{
int i;
for(i = 0; i < len; i++)
{
printf("%d\t", a[i]);
}
printf("\n");
}


int main(void)
{
int a[6] = {1,4,2,6,2,7};


show(a, 6);
sort(a, 6);
show(a, 6);


return 0;
}


2. 插入排序:

分为有序区和无序区,将无序区中的第一个数在有序区中找到对应的位置插入,原来有序区中的数向后移动

例如:

void insertsort(int *a, int len)
{
int i,j;
int temp;
int k = -1;
for(i = 1; i < len; i++)
{
k = i;
temp = a[k];
for(j = i-1; (j >= 0)&&(a[j]>temp); j--)
{
a[j+1] = a[j];
k = j;
}
a[k] = temp;
}
}


3.希尔排序:

将待排序列分为若干组,在每一组中进行插入排序,使整个序列基本有序,最后对整个序列进行插入排序

例如:


void Shellsort(int *a, int len)
{
int i,j;
int k = -1;
int garb = len;
int temp;
do{
garb = garb/3 + 1;
for(i = garb; i < len; i += garb)
{
k = i;
temp = a[k];
for(j = i-garb; (j >= 0)&&(temp < a[j]); j -= garb)
{
a[j+garb] = a[j];
k = j;
}
a[k] = temp;
}
}while(garb > 1);


}



4. 冒泡法排序

每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换

对冒泡排序常见的改进方法是加入一标志性变量exchange,用于标志某一趟排序过程中是否有数据交换,如果

进行某一趟排序时并没有进行数据交换,则说明数据已经按要求排列好,可立即结束排序,避免不必要的比较过程。

例如:

void Bubblesort(int *a, int len)
{
int i,j;
int exchange = 1;
for(i = 0; (i < len)&&exchange; i++)
{
exchange = 0;
for(j = len-1; j > i; j--)
{
if(a[j] < a[j-1])
{
swap(&a[j], &a[j-1]);
exchange = 1;
}
}
}
}


5.快速排序:

(1)一般将第一个元素作为基准元素,将待排序列分为两个序列,左边的元素都小于基准元素,右边的元素都大于基准元素

(2)分别对上述两个序列重复进行(1)中的方法。


例如:


int partition(int *a, int low, int high)              //找出基准元素的位置
{
int temp = a[low];
while(high > low)
{
while((high > low)&&(a[high]>=temp))
high--;


swap(&a[low], &a[high]);


while((high > low)&&(a[low]<=temp))
low++;


swap(&a[low], &a[high]);
}

return low;
}


void Quicksort(int* a, int low, int high)
{
if(low < high)
{
int index = partition(a,low,high);


Quicksort(a,low,index-1);
Quicksort(a,index+1,high);
}
}

原创粉丝点击