逆序對
設aaa為乙個有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的乙個逆序對。
定理
任意nnn個不同元素組成的序列平均具有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 如果給定陣列本身已經是排好的順序,那麼優化一下以上排序 如果第一次遍歷時沒有任何數交換,那麼證明...