排序算法之冒泡排序、选择排序

原文链接: http://www.cnblogs.com/leonn/archive/2010/04/08/1706833.html

         辞职后今天第一次参加前端开发工程师的面试,本来自己主要是搞后台开发的,不准备去,奈何对方的诚意,还是抱着试试看去的状态去了,后果可想而知,被问到列举几个排序算法,只说出排序算法,惭愧,做了这么久开发,有些基础的东西竟然淡忘,自己确实还需要多扎实基础的东西。这不写两个常用的算法练习下。

        冒泡排序已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变。再比较a[3]与a[4],依此类推,最后比较a[n-1]与a[n]的值。这样处理一轮后,a[n]的值一定是这组数据中最大的。再对a[1]~a[n-1]以相同方法处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的。再对a[1]~a[n-2]以相同方法处理一轮,依此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。优点:稳定,比较次数已知;缺点:慢,每次只能移动相邻两个数据,移动数据的次数多。

       选择排序已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[1]与a[3]的值,若a[1]大于a[3]则交换两者的值,否则不变。再比较a[1]与a[4],依此类推,最后比较a[1]与a[n]的值。这样处理一轮后,a[1]的值一定是这组数据中最小的。再将a[2]与a[3]~a[n]以相同方法比较一轮,则a[2]的值一定是a[2]~a[n]中最小的。再将a[3]与a[4]~a[n]以相同方法比较一轮,依此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。

         下面贴出代码:

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
    
using System;
using System.Text;

namespace SortArithmetic
{
public class MyClass
{
public static void Main()
{
int [] Nums = RandomNums( 3 , 27 );
ShowNums(
" 原数组是: " , Nums);
// ShowNums("排序后是:", BubbleSort(Nums));
ShowNums( " 排序后是: " , SelectSort(Nums));
Console.ReadLine();
}

#region 生成随机int数组
private static int [] RandomNums( int Length, int Count)
{
Random Rand
= new Random( 7 );
int [] Nums = new int [Count];
for ( int c = 0 ; c < Count; c ++ )
{
string Result = string .Empty;
for ( int i = 0 ; i < Length; i ++ )
{
Result
+= Rand.Next( 10 ).ToString();
}
Nums[c]
= Convert.ToInt32(Result);
}
return Nums;
}
#endregion


#region 排序算法:冒泡排序(升序) 排序次数可计算:int[n],n为5那么 6*(6-1)/2
private static int [] BubbleSort( int [] Nums)
{
for ( int c = 0 ; c < Nums.Length - 1 ; c ++ )
{
for ( int i = 0 ; i < Nums.Length - c - 1 ; i ++ )
{
int Temp = Nums[i + 1 ];
if (Nums[i] > Nums[i + 1 ])
{
Nums[i
+ 1 ] = Nums[i];
Nums[i]
= Temp;
}
}
}
return Nums;
}
#endregion

#region 排序算法:选择排序(升序)
private static int [] SelectSort( int [] Nums)
{
for ( int c = 0 ; c < Nums.Length - 1 ; c ++ )
{
for ( int i = c; i < Nums.Length - 1 ; i ++ )
{
int Temp = Nums[i + 1 ];
if (Nums[c] > Nums[i + 1 ])
{
Nums[i
+ 1 ] = Nums[c];
Nums[c]
= Temp;
}
}
}
return Nums;
}
#endregion

private static void ShowNums( string Msgs, int [] Nums)
{
Console.Write(Msgs);
foreach ( int n in Nums)
{
Console.Write(n.ToString()
+ " " );
}
Console.WriteLine();
}


}
}

转载于:https://www.cnblogs.com/leonn/archive/2010/04/08/1706833.html

猜你喜欢

转载自blog.csdn.net/weixin_30470643/article/details/94998956