演算法小白 1 排序演算法

2021-09-24 03:39:07 字數 2241 閱讀 3955

穩定:排序前a位於b前,且a=b,排序完後a仍然位於b前。

不穩定:排序前a位於b前,且a=b,排序完後a可能位於b後。

內排序:所有排序操作都在記憶體中完成;

外排序:由於資料太大,因此把資料放在磁碟中,而排序通過磁碟和記憶體的資料傳輸才能進行;

時間複雜度: 乙個演算法執行所耗費的時間。

空間複雜度:執行完乙個程式所需記憶體的大小。

n:資料規模

k:「桶」的個數

基本思想:選取乙個記錄作為基準,經過一趟排序,將整段序列分為兩個部分,其中一部分的值都小於基準,另一部分都大於基準。然後繼續對這兩部分繼續進行排序,直到整個序列達到有序,這是典型的分治思想。

步驟:(1)從數列中挑出乙個元素,稱為 「基準」(pivot);

(2)重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作;

(3)遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。

此時50左邊都比基準小,右邊都比基準大,完成了第一趟排序。

然後遞迴地對左右兩部分進行排序,直到全部有序。

**實現

package com.qcby.test;

/** * 快速排序演算法

*/public

class

quicksort

;quicksort

(data,

0, data.length-1)

;}private

static

void

quicksort

(int

data,

int left,

int right)

// 表示已找到

if(leftindex < rightindex)

// 從佇列前面往後找出比base 大的第乙個數

while

(leftindex < rightindex && data[leftindex]

<= base)

if(leftindex < rightindex)

}// 以基準數分為2部分, 前後部分遞迴排序

if(leftindex > left)

if(rightindex < right)

}/**

* 對換資料位置

效能分析

快速排序的最好的情況(每次資料劃分得很均勻)時間複雜度為o(nlogn),最壞的情況(需排序的資料為正序或逆序排列時)複雜度為o(n^2)。

參考:

演算法1 排序

氣泡排序 氣泡排序,比較相鄰的元素由小到大排序 function bubblesort arr return arr view code 快速排序 以基數為標準,最右開始查小於基數停止,最左邊開始查大於基數停止,互換位置停止的位置 left right表示基數左為小於基數,基數右大於基數的 拆分基數...

演算法 排序1 排序

題目 給定n個 長整型範圍內的 整數,要求輸出從小到大排序後的結果。本題旨在測試各種不同的排序演算法在各種資料情況下的表現。各組測試資料特點如下 輸入第一行給出正整數n 10 5 隨後一行給出n個 長整型範圍內的 整數,其間以空格分隔。在一行中輸出從小到大排序後的結果,數字間以1個空格分隔,行末不得...

演算法導論 1 排序演算法

排序演算法是最基礎的一類演算法。主要排序演算法包括選擇排序 插入排序 氣泡排序 合併排序 堆排序和快速排序。把這些排序演算法全部實現一邊,再把 演算法導論 對應章節後面的習題做一遍,確實是系統學習演算法的乙個不錯的開端。選擇排序的想法很簡單,把需要排序的陣列看成一堆撲克牌 先查一遍,抽出最小的作為第...