今天开始打算连续写点C#和算法之间的文章。算是自己复习一下以前学过的东西,也算是温故知新。顺道贴出来和大家分享,也祝愿所有程序员同道们能搞定算法这个烦人的东西。不过现在机器性能越来越强大,以后肯定更牛逼,这种情况下鲁棒算法就能解决一切问题。我就喜欢毛子们的思维:铁棒横扫一切!
1.冒泡排序
顾名思义,和冒泡一样。一个气泡在水里那肯定一股脑的从底浮到水面。这里的冒泡排序就是说每个数值和一个气泡一样,在整个序列里自动浮到相应的位置。
以【5,1,3,7,9】 为例。从大到小拍,9在底部,就象一个泡泡浮到水面上 变成【9,5,1,3,7】.
冒泡排序本质是比较两个相邻元素大小,然后按需求交换位置。所以5-1 不变,1-3 交换 ,1-7交换,1-9交换。第一趟【5,3,7,9,1】.下一次5-3 不变,3-7交换,3-9交换 【5,7,9,3,1】。之后【7,9,5,3,1】最后【9,7,5,3,1】。
所以5个元素排序,一共4次大循环可以搞定。外层一个循环,内部循环要每次对比两个元素并按照需求选择是否交换两个元素。
整体框架大同小异,但思路都是一样的。代码如下:
for (int outside = 0; outside < arr.Length-1; outside++)
{
for (int inside = 0; inside < arr.Length - 1 - outside; inside++)
{
if (arr[inside] > arr[inside+1])
{
int middle = arr[inside];
arr[inside] = arr[inside+1];
arr[inside+1] = middle;
}
}
}
2.选择排序
插入排序要把整个数列看作两部分,一部分是已经排序完成和另一部分混乱无序。每次从无序中选一个元素插入到有序部分的对应位置。
举例说明:【5,1,3,7,9】
第一次,整个数列无序。要把最大的放在第一位,【9,5,1,3,7】,之后9是有序的,变成【9,7,5,1,3】。依此类推。
【9,7,5,1,3】->【9,7,5,3,1】
代码如下:
for (int start = 0; start < 4; start++)
{
for (int next = start+1; next < 5; next++)
{
if (arr[start] < arr[next])
{
int middle = arr[start];
, arr[start] = arr[next];
arr[next] = middle;
}
}
}