您的位置:首页 > 其它

(选择、冒泡、插入、快速)排序

2012-01-05 14:39 211 查看
选择排序是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。

选择排序choose_sort.c

#include <stdio.h>
void choose_sort(int [],int);

int main()
{
int i,len;
int array[] = {3,4,2,1};
len = sizeof(array) / sizeof(int);    //元素个数
printf("原始输出:");
for(i = 0; i < len; i++)
printf("%d\t",array[i]);
printf("\n");
choose_sort(array,len);
printf("选择排序:");
for (i = 0; i < len; i++)
printf("%d\t",array[i]);
printf("\n");
return 0;
}

void choose_sort(int x[], int size)/*x数组名size为数组长度*/
{
int i, j, min, k;
for(i = 0; i < size-1; i++){
min = i;
for(j = i+1; j < size; j++){
if(x[min] > x[j])
min = j;
}
if(min != i){
k = x[i];
x[i] = x[min];
x[min] = k;
}
}
}


冒泡排序算法的运作如下:

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

冒泡排序bubble.c

#include <stdio.h>
void bubble(int[] , int);
int main()
{
int i,array[] = {3,4,2,1};
int len = sizeof(array)/sizeof(int);
printf("原始的输出:");
for(i = 0; i < len; i++)
printf("%d\t",array[i]);    //原始输出
printf("\n");
bubble(array,len);

return 0;
}

void bubble(int s[],int size)
{
int i,j,temp;
for(i = 1; i < size; i++)        //i不参与数组下标,仅表示比较size-1轮
for(j = 0; j < size-i; j++)
if (s[j] > s[j+1])
{
temp = s[j];
s[j] = s[j+1];
s[j+1] = temp;
}
printf("冒泡后输出:");
for (i = 0; i < size; i++)
printf("%d\t",s[i]);
printf("\n");
}


插入排序:将一个数插入到排好序的数列中,从而得到一个新的有序表。

一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
1 从第一个元素开始,该元素可以认为已经被排序
2 取出下一个元素,在已经排序的元素序列中从后向前扫描
3 如果该元素(已排序)大于新元素,将该元素移到下一位置
4 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
5 将新元素插入到该位置中
6 重复步骤2~5

插入排序insert.c

#include <stdio.h>
void isort(int [],int);

int main()
{
int i,len;
int array[] = {3,4,2,1};
len = sizeof(array) / sizeof(int);    //元素个数
printf("原始输出:");
for(i = 0; i < len; i++)
printf("%d\t",array[i]);
printf("\n");
isort(array,len);

return 0;
}

void isort(int a[],int size)
{
int i,j,temp;
for(i = 1; i < size; i++)        //遍历数组
{
temp = a[i];
for(j = i-1; j >= 0 && a[j] > temp; j--) //元素后移
a[j+1] = a[j];
a[j+1] = temp; //插入
}
printf("插入排序:");
for(i = 0; i < size; i++)
printf("%d\t",a[i]);
printf("\n");
}


快速排序使用分治法策略来把一个序列分为两个子序列。

步骤为:

从数列中挑出一个元素,称为 "基准"(pivot),

重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割结束之后,该基准就处于数列的中间位置。这个称为分割操作。

递归地把小于基准值元素的子数列和大于基准值元素的子数列排序。

快速排序qsort.c

#include<stdio.h>
void qsort(int v[],int left,int right);

int main()
{
int i,array[] = {4,3,2,1};
int len = sizeof(array) / sizeof(int);
printf("原始的输出:");
for(i = 0; i < len; i++)
printf("%d\t",array[i]);    //原始输出
printf("\n");
qsort(array,0,len-1);
printf("快速排列后:");
for(i = 0; i < len; i++)
printf("%d\t",array[i]);
printf("\n");

return 0;
}

void qsort(int v[],int left,int right) //快速排序法
{
int i,last;
void swap(int v[],int i,int j);//声明swap函数(交换v[i]与v[j]的值)

if(left >= right) //若包含数组少于2个
return;    //则不执行任何操作
swap(v,left,(left+right)/2);
last = left;    //移动到v[0]
for(i = left+1; i <= right; i++)    //划分子集
if (v[i] < v[left])
swap(v,++last,i);
swap(v,left,last);//恢复划分子集的元素
qsort(v,left,last-1);
qsort(v,last+1,right);
}

void swap(int v[],int i,int j)
{
int temp;
temp = v[i];
v[i] = v[j];
v[j] = temp;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐