(一)选择排序
是一种简单直观的排序算法,他的基本原理是:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将记录与第一个记录的位置进行交换;接着对不包括第一个记录以外的其他记录进行第二轮排序,得到最小的记录并与第二个记录进行位置交换;重负该过程,直到进行比较的记录只有一个为止。代码如下:
#include <stdio.h>
int main()
{
int arr[] = {23,34,76,98,68,38,79,56,94,18};
int i, j, temp, len, index, min;
len = sizeof(arr) / sizeof(int); //获取待排序列长度
for(i = 0; i < len; i++)
{
index = i; //记录最小值下标
min = arr[index]; //改变最小值
for(j = i + 1; j < len; j++) //查找最小值下标
{
if(arr[j] < min)
{
min = arr[j];
index = j;
}
}
if(i != index) //最小值交换
{
arr[index] = arr[i];
arr[i] = min;
}
}
for(i = 0; i < len; i++) //遍历排序后的数组
{
printf("%5d",arr[i]);
}
printf("\n");
return 0;
}
(二)快速排序
基本思想:通过一轮的排序将序列分割成独立的两部分,其中一部分序列的关键字(这里主要用值来表示)均比另一部分关键字小。继续对长度较短的序列进行同样的分割,最后到达整体有序。在排序过程中,由于已经分开的两部分的元素不需要进行比较,故减少了比较次数,降低了排序时间。
基本步骤
1)设置两个变量low、high,排序开始的时候low=0,high=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[1]; 3)从high开始向前搜索,即由后开始向前搜索(high–),找到第一个小于key的值,两者交换;
4)从low开始向后搜索,即由前开始向后搜索(low++),找到第一个大于key的值,两者交换;
5)重复第3、4步,直到low=high;
代码如下:
#include <stdio.h>
void quick_sort(int arr[], int low, int up)
{
if(low < up)
{
int temp, left, right;
temp = arr[low];
left = low;
right = up;
while(left < right) //单次循环
{
while(left < right && temp < arr[right]) //从后向前找到第一个小于关键字的数
{
right--;
}
if(left < right) //关键字与小于它的数交换
{
arr[left++] = arr[right];
}
while(left < right && temp > arr[left]) //从前向后查找,找到第一个大于该数的值
{
left++;
}
if(left < right) //交换
{
arr[right--] = arr[left];
}
}
arr[left] = temp; //插入关键字
quick_sort(arr, low, left - 1); //左递归
quick_sort(arr, left + 1, up); //右递归
}
}
int main()
{
int arr[] = {10,4,23,65,78,43,98,54,79,19};
int len = sizeof(arr) / sizeof(int);
int i;
printf("排序前:");
for(i = 0; i < len; i++)
{
printf("%5d",arr[i]);
}
printf("\n");
quick_sort(arr, 0, len-1);
printf("排序后:");
for(i = 0; i < len; i++)
{
printf("%5d",arr[i]);
}
printf("\n");
return 0;
}
(三)冒泡排序
基本概念:若序列有n个数,依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后,此时序列中最大的数被放在最后;再次进行第二趟比较,比较到倒数第二位截止,将第二大的数放在倒数第二位,直至n-1趟比较结束,则排序完成。
代码如下:
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
void maopao_sort(int arr[])
{
int i, j, temp;
for(i = 8; i >= 0; i--) //控制比较轮数
{
for(j = 0; j <= i; j++) //从左向右两两比较
{
if(arr[j] > arr[j + 1])
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int main()
{
srand((int)time(0));
int i, j, arr[10];
for(i = 0; i < 10; i++)
{
arr[i] = rand() % 100; //数组初始化
}
printf("排序前:");
for(i = 0; i < 10; i++) //遍历数组
{
printf("%4d",arr[i]);
}
printf("\n");
maopao_sort(arr); //冒泡排序
printf("排序后:");
for(i = 0; i < 10; i++) //遍历数组
{
printf("%4d",arr[i]);
}
printf("\n");
return 0;
}