去年11月份利用冒泡排序,用JS實現了一個機票查詢結果按照機票的票面價格和出發日期的頁面無刷新排序。這一段時間客戶又要求改為按照實際支付價格和日期進行排序,匆匆改好以後,感覺自己的算法和數據結構的能力幾乎荒廢了(好像以前也沒有過這種能力^_^)。這裡整理一下常用的排序算法,用c#實現,以備日後再用。Code is cheap.看具體實現吧。
1.冒泡排序
將被排序的記錄數組R[1..n]垂直排列,每個記錄R[i]看作是重量為R[i].key的氣泡。根據輕氣泡不能在重氣泡之下的原則,從下往上掃描數組R:凡掃描到違反本原則的輕氣泡,就使其向上"飄浮"(冒泡因此得名)。如此反復進行,直到最後任何兩個氣泡都是輕者在上,重者在下為止。
using System;
using System.Collections;
using System.Collections.Generic;
namespace BubbleSort
{
public class BubbleSorter
{
/// <summary>
/// 冒泡排序
/// </summary>
/// <param name="numArr"></param>
public void Sort(int[] numArr)
{
int tmpNum;
bool flag = false; //交換標志
for (int i = 1; i < numArr.Length; i++) //最多做numArr.Length-1趟排序
{
flag = false;
for (int j = numArr.Length - 1; j >= i; j--) //對當前無序區自下向上掃描
{
if (numArr[j] < numArr[j - 1]) //當前無序區: 輕的在下面,“冒泡”到上面
{
tmpNum = numArr[j];
numArr[j] = numArr[j - 1];
numArr[j - 1] = tmpNum;
flag = true;
}
}
if (!flag) //如果沒有發生交換,終止算法
return;
}
}
public class Program
{
public static void Main()
{
int[] testArr = new int[] { 1, 5, 11, 6, 4, 21, 99, 2, 15, 11, 34, 0, 33, 47 };
BubbleSorter sh = new BubbleSorter();
sh.Sort(testArr);
for (int m = 0; m < testArr.Length; m++)
Console.Write("{0} ", testArr[m]);
Console.Read();
}
}
}
}
冒泡算法小結:
因為每一趟排序都使有序區增加了一個氣泡,在經過n-1趟排序之後,有序區中就有n-1個氣泡,而無序區中氣泡的重量總是大於等於有序區中氣泡的重量,所以整個冒泡排序過程至多需要進行n-1趟排序。若在某一趟排序中未發現氣泡位置的交換,則說明待排序的無序區中所有氣泡均滿足輕者在上,重者在下的原則,因此,冒泡排序過程可在此趟排序後終止。為此,在下面給出的算法中,引入一個布爾量flag,在每趟排序開始前,先將其置為false,若排序過程中發生了交換,則將其置為true.各趟排序結束時檢查flag,若未曾發生過交換則終止算法,不再進行下一趟排序。(不加flag也可以實現排序,但是會造成不必要的循環和比較)。