九九热这里直有精品,1区二区三区在线播放,玖玖爱在线观看资源,国产aⅴ综合网,午夜福利男女,日本亚洲欧美三级,日韩无码黄色导航,内射少妇13区,中文字幕高清网

您身邊的軟件定制專家--9年開發(fā)經(jīng)驗(yàn)為您護(hù)航

18678812288
0531-88887250

C#排序算法小結(jié)

文章作者:濟(jì)南軟件開發(fā) 時(shí)間:2016年11月08日

  前言

  算法這個(gè)東西其實(shí)在開發(fā)中很少用到,特別是web開發(fā)中,但是算法也很重要,因?yàn)槿魏蔚某绦?,任何的軟件,都是由很多的算法和?shù)據(jù)結(jié)構(gòu)組成的。但是這不意味著算法對(duì)于每個(gè)軟件設(shè)計(jì)人員的實(shí)際工作都是很重要的。每個(gè)項(xiàng)目特點(diǎn)和需求特殊也導(dǎo)致算法運(yùn)用場(chǎng)景上不同。但是個(gè)人覺得算法運(yùn)用的好的話會(huì)給自己在程序設(shè)計(jì)的時(shí)候提供比較好的思路。下面就對(duì)一些排序算法小結(jié)一下,就當(dāng)做自己的一個(gè)筆記吧。

  插入排序

  1.簡(jiǎn)介

  插入排序(Insertion Sort)的算法描述是一種簡(jiǎn)單直觀的排序算法。它的工作原理是通過構(gòu)建有序序列,對(duì)于未排序數(shù)據(jù),在已排序序列中從后向前掃描,找到相應(yīng)位置并插入。插入排序在實(shí)現(xiàn)上,通常采用in-place排序(即只需用到O(1)的額外空間的排序),因而在從后向前掃描過程中,需要反復(fù)把已排序元素逐步向后挪位,為最新元素提供插入空間。

  2.算法描述

  一般來說,插入排序都采用in-place在數(shù)組上實(shí)現(xiàn)。具體算法描述如下:

  1.從第一個(gè)元素開始,該元素可以認(rèn)為已經(jīng)被排序

  2.取出下一個(gè)元素,在已經(jīng)排序的元素序列中從后向前掃描

  3.如果該元素(已排序)大于新元素,將該元素移到下一位置

  4.重復(fù)步驟3,直到找到已排序的元素小于或者等于新元素的位置

  5.將新元素插入到該位置后

  6.重復(fù)步驟2~5

  如果比較操作的代價(jià)比交換操作大的話,可以采用二分查找法來減少比較操作的數(shù)目。該算法可以認(rèn)為是插入排序的一個(gè)變種,稱為二分查找排序。

  3.使用插入排序?yàn)橐涣袛?shù)字進(jìn)行排序的過程

  最差時(shí)間復(fù)雜度 O(n^{2})

  最優(yōu)時(shí)間復(fù)雜度 O(n)

  平均時(shí)間復(fù)雜度O(n^{2})

  4.C#實(shí)現(xiàn)

  復(fù)制代碼

  /// <summary>

  /// 插入排序

  /// </summary>

  public class InsertionSorter

  {

  public void Sort(int[] list)

  {

  for (int i = 1; i < list.Length; ++i)

  {

  int t = list[i];

  int j = i;

  while ((j > 0) && (list[j - 1] > t))

  {

  list[j] = list[j - 1];

  --j;

  }

  list[j] = t;

  }

  }

  }

  復(fù)制代碼

  數(shù)組

  int[] iArrary = new int[] { 1, 5, 3, 6, 10, 55, 9, 2, 87, 12, 34, 75, 33, 47 };

  希爾排序

  1.簡(jiǎn)介

  希爾排序,也稱遞減增量排序算法,是插入排序的一種更高效的改進(jìn)版本。希爾排序是非穩(wěn)定排序算法。

  2.算法實(shí)現(xiàn)

  原始的算法實(shí)現(xiàn)在最壞的情況下需要進(jìn)行O(n2)的比較和交換。V. Pratt的書[1] 對(duì)算法進(jìn)行了少量修改,可以使得性能提升至O(n log2 n)。這比最好的比較算法的O(n log n)要差一些。

  希爾排序通過將比較的全部元素分為幾個(gè)區(qū)域來提升插入排序的性能。這樣可以讓一個(gè)元素可以一次性地朝最終位置前進(jìn)一大步。然后算法再取越來越小的步長(zhǎng)進(jìn)行排序,算法的最后一步就是普通的插入排序,但是到了這步,需排序的數(shù)據(jù)幾乎是已排好的了(此時(shí)插入排序較快)。

  假設(shè)有一個(gè)很小的數(shù)據(jù)在一個(gè)已按升序排好序的數(shù)組的末端。如果用復(fù)雜度為O(n2)的排序(冒泡排序或插入排序),可能會(huì)進(jìn)行n次的比較和交換才能將該數(shù)據(jù)移至正確位置。而希爾排序會(huì)用較大的步長(zhǎng)移動(dòng)數(shù)據(jù),所以小數(shù)據(jù)只需進(jìn)行少數(shù)比較和交換即可到正確位置。

  一個(gè)更好理解的希爾排序?qū)崿F(xiàn):將數(shù)組列在一個(gè)表中并對(duì)列排序(用插入排序)。重復(fù)這過程,不過每次用更長(zhǎng)的列來進(jìn)行。最后整個(gè)表就只有一列了。將數(shù)組轉(zhuǎn)換至表是為了更好地理解這算法,算法本身僅僅對(duì)原數(shù)組進(jìn)行排序(通過增加索引的步長(zhǎng),例如是用i += step_size而不是i++)。

  3.排序過程

  最差時(shí)間復(fù)雜度 根據(jù)步長(zhǎng)串行的不同而不同。O(n\log^2 n)

  最優(yōu)時(shí)間復(fù)雜度 O(n)

  平均時(shí)間復(fù)雜度  根據(jù)步長(zhǎng)串行的不同而不同。

  4.C#實(shí)現(xiàn)

  復(fù)制代碼

  /// <summary>

  /// 希爾排序

  /// </summary>

  public class ShellSorter

  {

  public void Sort(int[] list)

  {

  int inc;

  for (inc = 1; inc <= list.Length / 9; inc = 3 * inc + 1) ;

  for (; inc > 0; inc /= 3)

  {

  for (int i = inc + 1; i <= list.Length; i += inc)

  {

  int t = list[i - 1];

  int j = i;

  while ((j > inc) && (list[j - inc - 1] > t))

  {

  list[j - 1] = list[j - inc - 1];

  j -= inc;

  }

  list[j - 1] = t;

  }

  }

  }

  }

  復(fù)制代碼

  選擇排序

  1.簡(jiǎn)介

  選擇排序(Selection sort)是一種簡(jiǎn)單直觀的排序算法。它的工作原理如下。首先在未排序序列中找到最?。ù螅┰?,存放到排序序列的起始位置,然后,再?gòu)氖S辔磁判蛟刂欣^續(xù)尋找最?。ù螅┰?,然后放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。

  選擇排序的主要優(yōu)點(diǎn)與數(shù)據(jù)移動(dòng)有關(guān)。如果某個(gè)元素位于正確的最終位置上,則它不會(huì)被移動(dòng)。選擇排序每次交換一對(duì)元素,它們當(dāng)中至少有一個(gè)將被移到其最終位置上,因此對(duì)n個(gè)元素的表進(jìn)行排序總共進(jìn)行至多n-1次交換。在所有的完全依靠交換去移動(dòng)元素的排序方法中,選擇排序?qū)儆诜浅:玫囊环N。

  2.實(shí)現(xiàn)過程

  最差時(shí)間復(fù)雜度 О(n2)

  最優(yōu)時(shí)間復(fù)雜度 О(n2)

  平均時(shí)間復(fù)雜度 О(n2)

  3.C#實(shí)現(xiàn)

  復(fù)制代碼

  /// <summary>

  /// 選擇排序

  /// </summary>

  public class SelectionSorter

  {

  // public enum comp {COMP_LESS,COMP_EQUAL,COMP_GRTR};

  private int min;

  // private int m=0;

  public void Sort(int[] list)

  {

  for (int i = 0; i < list.Length - 1; ++i)

  {

  min = i;

  for (int j = i + 1; j < list.Length; ++j)

  {

  if (list[j] < list[min])

  min = j;

  }

  int t = list[min];

  list[min] = list[i];

  list[i] = t;

  // Console.WriteLine("{0}",list[i]);

  }

  }

  }

  復(fù)制代碼

  冒泡排序

  1.簡(jiǎn)介

  冒泡排序(Bubble Sort,臺(tái)灣譯為:泡沫排序或氣泡排序)是一種簡(jiǎn)單的排序算法。它重復(fù)地走訪過要排序的數(shù)列,一次比較兩個(gè)元素,如果他們的順序錯(cuò)誤就把他們交換過來。走訪數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成。這個(gè)算法的名字由來是因?yàn)樵叫〉脑貢?huì)經(jīng)由交換慢慢“浮”到數(shù)列的頂端。

  冒泡排序?qū)個(gè)項(xiàng)目需要O(n^{2})的比較次數(shù),且可以原地排序。盡管這個(gè)算法是最簡(jiǎn)單了解和實(shí)作的排序算法之一,但它對(duì)于少數(shù)元素之外的數(shù)列排序是很沒有效率的。

  冒泡排序是與插入排序擁有相等的執(zhí)行時(shí)間,但是兩種法在需要的交換次數(shù)卻很大地不同。在最壞的情況,冒泡排序需要O(n^{2})次交換,而插入排序只要最多O(n)交換。冒泡排序的實(shí)現(xiàn)(類似下面)通常會(huì)對(duì)已經(jīng)排序好的數(shù)列拙劣地執(zhí)行(O(n^{2})),而插入排序在這個(gè)例子只需要O(n)個(gè)運(yùn)算。因此很多現(xiàn)代的算法教科書避免使用冒泡排序,而用插入排序取代之。冒泡排序如果能在內(nèi)部循環(huán)第一次執(zhí)行時(shí),使用一個(gè)旗標(biāo)來表示有無需要交換的可能,也有可能把最好的復(fù)雜度降低到O(n)。在這個(gè)情況,在已經(jīng)排序好的數(shù)列就無交換的需要。若在每次走訪數(shù)列時(shí),把走訪順序和比較大小反過來,也可以稍微地改進(jìn)效率。有時(shí)候稱為往返排序,因?yàn)樗惴〞?huì)從數(shù)列的一端到另一端之間穿梭往返。

  2.算法實(shí)現(xiàn)

  1.比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)。

  2.對(duì)每一對(duì)相鄰元素作同樣的工作,從開始第一對(duì)到結(jié)尾的最后一對(duì)。在這一點(diǎn),最后的元素應(yīng)該會(huì)是最大的數(shù)。

  3.針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè)。

  4.持續(xù)每次對(duì)越來越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對(duì)數(shù)字需要比較。

  3.實(shí)現(xiàn)過程

  最差時(shí)間復(fù)雜度 O(n^{2})

  最優(yōu)時(shí)間復(fù)雜度 O(n)

  平均時(shí)間復(fù)雜度 O(n^{2})

  4.C#實(shí)現(xiàn)

  復(fù)制代碼

  /// <summary>

  /// 冒泡排序

  /// </summary>

  public class bubblesort

  {

  public void BubbleSort(int[] R)

  {

  int i, j, temp; //交換標(biāo)志

  bool exchange;

  for (i = 0; i < R.Length; i++) //最多做R.Length-1趟排序

  {

  exchange = false; //本趟排序開始前,交換標(biāo)志應(yīng)為假

  for (j = R.Length - 2; j >= i; j--)

  {

  if (R[j + 1] < R[j]) //交換條件

  {

  temp = R[j + 1];

  R[j + 1] = R[j];

  R[j] = temp;

  exchange = true; //發(fā)生了交換,故將交換標(biāo)志置為真

  }

  }

  if (!exchange) //本趟排序未發(fā)生交換,提前終止算法

  {

  break;

  }

  }

  }

  }

  復(fù)制代碼


想要了解更多詳情歡迎來電咨詢18678812288
登陸網(wǎng)址:m.h6244.cn。
聯(lián)系人:王經(jīng)理。

丰镇市| 阜康市| 江门市| 来安县| 松潘县| 同仁县| 黑水县| 尼木县| 广元市| 沙洋县| 邳州市| 天祝| 郁南县| 砚山县| 临朐县| 富锦市| 云霄县| 鄂托克旗| 清河县| 托里县| 七台河市| 汉中市| 武定县| 宁安市| 新泰市| 阜南县| 岐山县| 深泽县| 剑河县| 精河县| 威远县| 宁海县| 万荣县| 武汉市| 黑水县| 大同县| 万安县| 林口县| 合江县| 天峻县| 平陆县|