日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

图解选择排序与插入排序

發(fā)布時(shí)間:2023/12/9 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图解选择排序与插入排序 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

上一篇詳述了冒泡排序及其優(yōu)化,有興趣的可以看看:

如何優(yōu)化冒泡排序?

一、選擇排序(SelectionSort)

  • 算法思想:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再?gòu)氖S辔磁判蛟刂欣^續(xù)尋找最小(大)元素,然后放到已排序序列的末尾。以此類(lèi)推,直到所有元素均排序完畢。
  • 排序過(guò)程:(默認(rèn)升序)
  • 從原序列中找到最小值,與數(shù)組第一個(gè)元素交換;
  • 除第一個(gè)元素外,從剩下未排序的序列中找到最小值,與數(shù)組第二個(gè)元素交換;
  • 共N-1趟,每趟都找到未排序的最小值,放到已排序的序列后面。
  • 如圖所示,每一趟找到未排序的最小值,并放到有序序列的后面(即當(dāng)前趟對(duì)應(yīng)于數(shù)組中的第幾個(gè)元素)。

    • java實(shí)現(xiàn)選擇排序
    ?private?static?<T?extends?Comparable<??super?T>>?void?selectionSort(T[]?nums)?{
    ????????if?(null?==?nums?||?nums.length?==?0)?{
    ????????????throw?new?RuntimeException("數(shù)組為null或長(zhǎng)度為0");
    ????????}
    ????????int?length?=?nums.length;
    ????????int?minValueIndex?=?0;
    ????????T?temp?=?null;
    ????????for?(int?i?=?0;?i?<?length?-?1;?i++)?{
    ????????????minValueIndex?=?i;
    ????????????for?(int?j?=?i?+?1;?j?<?length;?j++)?{
    ????????????????if?(nums[j].compareTo(nums[minValueIndex])?<?0)?{
    ????????????????????minValueIndex?=?j;
    ????????????????}
    ????????????}
    ????????????if?(minValueIndex?!=?i)?{
    ????????????????temp?=?nums[i];
    ????????????????nums[i]?=?nums[minValueIndex];
    ????????????????nums[minValueIndex]?=?temp;
    ????????????}
    ????????}
    ????}
    復(fù)制代碼
    • 時(shí)間、空間復(fù)雜度及穩(wěn)定性分析:
  • 最好時(shí)間復(fù)雜度:最好情況是輸入序列已經(jīng)升序排列,需要比較n*(n-1)/2次,但不需要交換元素,即交換次數(shù)為:0;所以最好時(shí)間復(fù)雜度O(n^2)。
  • 最壞時(shí)間復(fù)雜度:最壞情況是輸入序列是逆序的,則每一趟都需要交換。即需要比較n*(n-1)/2次,元素交換次數(shù)為:n-1次。所以最壞時(shí)間復(fù)雜度還是O(n^2)。
  • 平均時(shí)間復(fù)雜度:O(n^2)
  • 空間復(fù)雜度:只用到一個(gè)臨時(shí)變量,所以空間復(fù)雜度O(1)
  • 穩(wěn)定性:不穩(wěn)定排序。如序列3,5,3,1。第一次交換結(jié)果為1,5,3,3,我們發(fā)現(xiàn)原序列的第一個(gè)3排在了第二個(gè)3的后面。
  • 二、插入排序(InsertSort)

    • 算法思想:通過(guò)構(gòu)建有序序列,對(duì)于未排序數(shù)據(jù),在已排序序列中從后向前掃描,找到相應(yīng)位置并插入。插入排序因而在從后向前掃描過(guò)程中,需要反復(fù)把已排序元素逐步向后挪位,為最新元素提供插入空間。

    • 排序過(guò)程:(默認(rèn)升序)

      InsertionSort 和打撲克牌時(shí),從牌桌上逐一拿起撲克牌,在手上排序的進(jìn)程相同。

      舉例:

      Input: {4, 3, 8, 5, 2, 6, 1, 7}。

  • 首先拿起第一張牌, 手上有 {4}。

  • 拿起第二張牌 3, 把 3insert 到手上的牌 {4}, 得到 {3 ,4}。

  • 拿起第三張牌 8, 把 8 insert 到手上的牌 {3,4 }, 得到 {3 ,4,8}。

  • 以此類(lèi)推。

    插入排序由N-1趟排序組成。對(duì)于p=1到N-1趟排序后,插入排序保證從位置0到位置p上的元素為已排序狀態(tài)。即插入排序利用了從位置0到p-1位置上已經(jīng)有序的條件,將位置p上的元素向前查找適當(dāng)?shù)奈恢貌迦氪嗽亍?/strong>

    如圖所示:在第p趟,我們將位置p上的元素向左移動(dòng),直到它在前p+1個(gè)元素(包括當(dāng)前位置的元素)中的正確位置被找到。

    • java實(shí)現(xiàn)插入排序

      private?static?<T?extends?Comparable<??super?T>>?void?insertSort(T[]?nums)?{
      ??????if?(null?==?nums?||?nums.length?==?0)?{
      ??????????throw?new?RuntimeException("數(shù)組為null或長(zhǎng)度為0");
      ??????}
      ??????int?length?=?nums.length;
      ??????T?temp?=?null;
      ??????int?i?=?0;
      ??????for?(int?p?=?1;?p?<?length;?p++)?{
      ??????????temp?=?nums[p];
      ??????????for?(i?=?p;?i?>?0?&&?(temp.compareTo(nums[i?-?1])?<?0);?i--)?{
      ??????????????nums[i]?=?nums[i?-?1];
      ??????????}
      ??????????nums[i]?=?temp;
      ??????}
      ??}
      復(fù)制代碼
    • 時(shí)間、空間復(fù)雜度及穩(wěn)定性分析:

  • 最好時(shí)間復(fù)雜度:最好情況就是,序列已經(jīng)是升序排列了,在這種情況下,需要進(jìn)行的比較操作需n-1次即可。即最好時(shí)間復(fù)雜度O(n)
  • 最壞時(shí)間復(fù)雜度:最壞情況就是,序列是降序排列,那么總共需要n(n-1)/2次比較;移動(dòng)次數(shù)(賦值操作)是比較次數(shù)減去n-1次(因?yàn)槊恳淮窝h(huán)的比較都比賦值多一次,共n-1次循環(huán)),即n(n-1)/2 - (n-1);所以最壞時(shí)間復(fù)雜度O(n^2)
  • 平均時(shí)間復(fù)雜度:O(n^2)。
  • 空間復(fù)雜度:只用到一個(gè)臨時(shí)變量,所以空間復(fù)雜度O(1)
  • 穩(wěn)定性:穩(wěn)定。
  • 三、總結(jié)

    ? 選擇排序的主要優(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。選擇排序最好、最壞時(shí)間復(fù)雜度都為O(n^2),空間復(fù)雜度為O(1),屬于不穩(wěn)定排序。

    ? 插入排序不適合對(duì)于數(shù)據(jù)量比較大的排序應(yīng)用。但是,如果需要排序的數(shù)據(jù)量很小,例如,量級(jí)小于千;或者若已知輸入元素大致上按照順序排列,那么插入排序還是一個(gè)不錯(cuò)的選擇。插入排序最好時(shí)間復(fù)雜度為O(n)、最壞時(shí)間復(fù)雜度為O(n^2),空間復(fù)雜度為O(1),屬于穩(wěn)定排序。

    總結(jié)

    以上是生活随笔為你收集整理的图解选择排序与插入排序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。