簡單排序(選擇 冒泡 插入)

2021-10-02 22:35:03 字數 3105 閱讀 9241

逆序對

設a

aa為乙個有n

nn個數字的有序集(n

>

1n>1

n>

1),其中所有數字各不相同。如果存在正整數i

ii、j

jj使得1≤i

n1 \leq i < j \leq n

1≤in而且a[i

]>a[

j]

a[i]>a[j]

a[i]

>a[

j],則( a[

i],a

[j])

(a[i],a[j])

(a[i],

a[j]

)這個有序對稱為a的乙個逆序對。

定理

任意n

nn個不同元素組成的序列平均具有n(n

−1)/

4n(n-1)/4

n(n−1)

/4個逆序對。

穩定性

能保證兩個相等的數,經過排序之後,其在序列的前後位置順序不變。(a1=

a2

a_1=a_2

a1​=a2

​,排序前a

1a_1

a1​在a

2a_2

a2​前面,排序後a

1a_1

a1​還在a

2a_2

a2​前面)

簡單排序有三種,選擇排序(selection sort)、氣泡排序(bubble sort)和插入排序(insertion sort)。

選擇排序

從待排序序列選擇最小的元素與序列第1個元素交換;從剩下的元素中選擇最小的元素與序列第2個元素交換;依此類推直到最後乙個元素。

**實現:

/* 選擇排序 */

void

selectionsort

(listelementtype *a,

int size)

}swap

(&a[min]

,&a[i]);

/* 將未排序列中最小元素與a[i]交換位置 */

}}

時間複雜度

最壞情況時間複雜度:two

rst(

n)=o

(n2)

t_(n)=o(n^2)

tworst

​(n)

=o(n

2)平均時間複雜度:tav

g(n)

=o(n

2)

t_(n)=o(n^2)

tavg​(

n)=o

(n2)

穩定性

選擇排序是不穩定排序。

氣泡排序

假設陣列有n

nn個元素,從頭到尾依次比較元素a[i]和a[i+1],如果順序不對,將兩個元素調換位置。當比較完元素a[n-2]和a[n-1]的時候,陣列中最大的(假設從小到大排序)元素就會被放到陣列最後乙個位置。

對陣列中前n−1

n-1n−

1個元素重複第一步的操作,可將n−1

n-1n−

1個元素中最大的元素放在n−1

n-1n−

1個元素的最後位置。

重複執行第一步n−1

n-1n−

1次,可將陣列排序完成。

**實現

/* 氣泡排序 */

void

bubblesort

(listelementtype *a,

int size)}}

}

優化

當某次遍歷的之後,如果序列已經排好序了,那麼就沒有必要繼續遍歷下去了,所以我們可以增加乙個標記flag,用來監控某一次遍歷過程中是否發生元素位置的交換,如果未發生交換,就可以直接停止迴圈了。

/* 氣泡排序 */

void

bubblesort

(listelementtype *a,

int size)

}/* 沒發生交換,直接退出迴圈 */

if(flag ==0)

}}

時間複雜度

穩定性

氣泡排序是穩定排序。

插入排序

認為陣列第乙個元素是有序的,第二個元素和第乙個元素比較大小,如果第二個元素比較小,則兩者交換位置。此時,第一第二個元素就是有序的了。

第三個元素和它前乙個元素對比,如果第三個元素比較小,互換位置,然後該元素再與互換位置後的它前面的乙個元素做同樣的操作,直到它比它前乙個元素值大或它變成了第乙個元素。操作結束後前三個元素就是有序的了。

一直重複上面的操作,直到所有元素都變成有序的。

**實現

/* 插入排序 */

void

insertionsort

(listelementtype *a,

int size)

a[j]

= temp;

}}

時間複雜度

時間複雜度:t(n

)=o(

n+i)

t(n)=o(n+i)

t(n)=o

(n+i

)(其中i

ii是陣列中逆序對的個數)

平均時間複雜度:tav

g(n)

=o(n

2)

t_(n)=o(n^2)

tavg​(

n)=o

(n2)

穩定性

插入排序是穩定排序。

簡單排序 選擇 插入 氣泡排序

3種順序排序方法。簡單排序是指時間複雜度為o n 2 的排序方法。1 選擇排序 將某個特定值有序的放置在最終位置上 外層迴圈控制最終位置的序號,內層迴圈從外層迴圈序號處向後遍歷,找到最小值。2 插入排序 插入排序將某個特定值插入到值列的某個子集中,並重複該過程 外層迴圈控制要插入的資料 從第二個數到...

常見簡單排序演算法(選擇,冒泡,插入)

原理 每一次從待排序的資料元素中選出最大 小 的,將其放在前面已排好序的資料後面,然後又從剩下的資料中選出最大 小 的,重複操作,以此類推。c include void main int i,j,k,temp for i 0 i 10 i temp a i 找到了就開始交換位置 a i a k a ...

簡單排序演算法 冒泡 插入 選擇

1.氣泡排序 資料兩兩比較,每次冒出乙個最大 小 值,需要n n 1 1次比較,時間複雜度o n 2 基本 void sort int arr void swap int arr,int i,int j 如果給定陣列本身已經是排好的順序,那麼優化一下以上排序 如果第一次遍歷時沒有任何數交換,那麼證明...