实现一个选择排序程序,排序整型数组。
首先明白什么是选择排序,选择排序是指,每一次在待排序数列中,选择一个最大的(或最小的)放到数列的最前端,然后再用这种方法排列后面的数列。
下面用选择排序实现从小到大排序,程序代码如下:
#include <stdio.h>
#include <assert.h>
#include <Windows.h>
void show(int arr[], int length) //打印数组函数
{
int i = 0;
for (i = 0; i < length; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int Myline(int arr[], int length)
{ //选择排序函数(由小到大排序)
assert(arr);
int i = 0;
int k = 0;
int j = 0;
for (j = 0; j < length - 1; j++)
{
int min = j;
k = j;
for (i = j+1; i < length; i++)
{
if (arr[min]>arr[i]) //如果前一个数值大于它后面的
{
min = i; //把小的下标记下
k = min;
}
}
if (k!=j) //当前数不是最小的,交换当前数和比较的数列里最小的数
{
arr[j] = arr[j] ^ arr[k];
arr[k] = arr[j] ^ arr[k];
arr[j] = arr[j] ^ arr[k];
}
}
}
int main()
{
int a[] = { 2, 3, 4, 5, 1, 8, 45 , 6, 0}; //输入要比较的数列
int len = sizeof(a) / sizeof(a[0]);
show(a, len);
Myline(a, len);
show(a, len);
system("pause");
return 0;
}
运行结果如下:
程序也可以从大到小排序,只需把判别条件改为 if(arr[min] < arr[i])即可,此处忽略min的真实意思,把它当做序列内最大的数。程序中用的是max,比较符合意思,
程序如下,原理和由小到大排序一模一样:
#include <stdio.h>
#include <assert.h>
#include <Windows.h>
void show(int arr[], int length) //打印数组函数
{
int i = 0;
for (i = 0; i < length; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int Myline(int arr[], int length)
{ //选择排序函数
assert(arr);
int i = 0;
int k = 0;
int j = 0;
for (j = 0; j < length - 1; j++)
{
int min = j;
k = j;
for (i = j+1; i < length; i++)
{
if (arr[max]<arr[i]) //如果前一个数值小于它后面的
{
max = i; //把大的下标记下
k = max;
}
}
if (k!=j) //当前数不是最大的,交换当前数和比较的数列里最大的数
{
arr[j] = arr[j] ^ arr[k];
arr[k] = arr[j] ^ arr[k];
arr[j] = arr[j] ^ arr[k];
}
}
}
int main()
{
int a[] = { 2, 3, 4, 5,1,8, 45 ,6,0}; //输入要比较的数列
int len = sizeof(a) / sizeof(a[0]);
show(a, len);
Myline(a, len);
show(a, len);
system("pause");
return 0;
}
运行结果如下: