C Primer Plus第十一章字符串排序程序11.25中,涉及到“选择排序算法”,这也是找工作笔试或面试可能会遇到的题目,下面谈谈自己的理解。
举个例子:对数组num[5]={3,5,2,1,4}中各元素进行从小到大的排序并输出(为了更清楚了解排序过程,要求输出每一轮排序后的结果)。
附上程序(写的有点复杂,主要代码只有几行):
/* 对一个整数数组中的元素从小到大排序 */ /************* 选择排序法 *************/ /********* by行动救赎 2016.9.21********/ #include <stdio.h> void sort(int *, int); //数组排序 void prnt(int *, int); //数组打印 /*****************主函数******************/ int main(void) { int num[5] = {3,5,2,1,4}; sort(num, 5); return 0; } /*****************排序函数******************/ void sort(int * num, int n) { int i, temp; int top, seek; printf(" 第%d次结果:", 0); prnt(num, n); for (top=0; top<n-1; top++) { for(seek=top+1; seek<n; seek++) { if(num[top] > num[seek]) {temp=num[top]; num[top]=num[seek]; num[seek]=temp;} prnt(num, n); } printf(" 第%d次结果:", top+1); prnt(num, n); } } /*****************打印数组******************/ void prnt(int * num, int n) { int i; for(i=0; i<n; i++) printf("%d ", *(num+i)); printf(" "); }
1.第一个数和剩下的n-1个数依次比较,遇到比第一个数小的数,就将该数和第一个数交换:3和5比,3<5,不用交换,35214;3和2比,3>2,交换,25314;2和1比,2>1,交换,15324;1和4比较,1<4,不换,15324。
2.第二个数和剩下的n-2个数依次比较,遇到比第二个数小的数,就将该数和第二个数交换:5<3?,换,13524;3<2?换,12534;2<4?不换,12534。
3.第三个数和剩下的n-3个数依次比较,遇到比第三个数小的数,就将该数和第三个数交换:5<3?,换,12354;3<4?不换,12354。
4.第四个数和剩下的n-4个数依次比较,遇到比第四个数小的数,就将该数和第四个数交换:5<4?,换,12345。
下面是核心思路的代码:
for (top=0; top<n-1; top++)
{
for(seek=top+1; seek<n; seek++)
if(num[top] > num[seek])
{temp=num[top]; num[top]=num[seek]; num[seek]=temp;}
}
一点浅薄的探究,和大家分享一下。