插入排序法
希爾排序
選擇排序
堆排序歸併排序
給定n個(長整型範圍內的)整數,要求輸出從小到大排序後的結果。
本題旨在測試各種不同的排序演算法在各種資料情況下的表現。各組測試資料特點如下:
輸入格式:
輸入第一行給出正整數n(≤100000 ),隨後一行給出n個(長整型範圍內的)整數,其間以空格分隔。
輸出格式:
在一行中輸出從小到大排序後的結果,數字間以1個空格分隔,行末不得有多餘空格。
輸入樣例:
11
498110-
170-20
2950843
-5
輸出樣例:
-20-
17-50
481029
4350
981
i從0開始遞增,如果第i個元素小於後乙個元素,就交換它們的位置,這樣可以讓最大的元素移動到最後。然後讓次大的元素移動到倒數第二個位置,一直迴圈。
void
bubble_sort
(int a,
int n )}if
( flag==0)
break;}
}
時間複雜度:最好情況(順序)t=o(n);最壞情況(逆序) t=o(n2)
穩定性:穩定 。
前面i-1個元素是有序的,插入第i個元素,尋找合適的位置,讓這i個元素也是有序的。
void
insertion_sort
(int a,
int n )
else}}
}
時間複雜度:最好情況(順序)t=o(n);最壞情況(逆序) t=o(n2)
穩定性:穩定
關於逆序對:氣泡排序法和插入排序法每次都消除乙個 逆序對,所以其時間複雜度和資料規模以及逆序對的數量i有關。t(n,i)=o(n,i).所以如果元素基本有序,那麼插入排序是簡單且高效的。
任意n個不同元素組成的序列平均有n(n-1)/4個逆序對,所以如果僅以交換相鄰兩元素來排序的演算法,其平均時間複雜度為ω(n2)。
第一行相同顏色數字的間隔為5,每一種顏色單獨進行插入排序。然後間隔為3,每一種顏色單獨進行插入排序。最後間隔為1進行排序,相當於一次插入排序。
void
shell_sort
(int a,
int n)
else}}
}
時間複雜度:如果增量序列是d=n/2,然後每次d除以2,最壞情況是t=θ(n2)。原因是相鄰的d不互質,小的d可能不會發揮作用。
使用其他的增量序列,hibbard序列和sedgewick序列可以有效減小時間複雜度。
穩定性:不穩定。比如2 10 8 8
,在增量元素是2,也就是間隔為2進行排序時,第二個8會和10交換位置,導致兩個8的相對位置也發生了變化。
找到未排序部分的最小元素,換到先前有序部分的末尾後乙個,此時有序部分多了乙個元素,未排序部分少了乙個元素。
int
scanformin
(int a,
int i,
int n)
return minj;
}void
selection_sort
(int a,
int n)
}
時間複雜度:用直接掃瞄所有元素的方式找最小,時間複雜度為t=θ(n2)
穩定性:不穩定。比如序列5 8 5 2 9
,第一次掃瞄最小是2,2將和第乙個5進行交換,這樣兩個5的相對位置發生了改變。
1.最小堆排序。建立最小堆,每次彈出根結點元素到臨時陣列,最後再把臨時陣列的元素都複製回原來的陣列。
2.最大堆排序。建立最大堆,然後將最大堆頭結點和最後乙個結點交換,也就是把最大元素放到了陣列的尾巴上。
void
percdown
(int a,
int i,
int n )
a[parent]
= x;
}void
heap_sort
(int a,
int n)
}
時間複雜度:最小堆排序需要臨時陣列,複製資料也需要時間。t(n)=o(nlogn)
最大堆排序平均時間複雜度為2nlogn-o(nloglogn),可以看出比nlogn小一點
穩定性:不穩定。比如序列1 7 3 7
,整理成最大堆時,第乙個7會到堆頂,然後會被換到陣列末尾,這樣兩個7的相對位置就發生了改變。
基本思想是把兩個有序序列歸併成乙個有序序列。如果採用遞迴演算法,就是將一整個序列分成左右兩個,先把左右序列都調整成有序的,然後歸併左右序列。如果採用非遞迴演算法,使用乙個變數length,先歸併length=1的序列,然後歸併length=2的序列,一直到length大於n.
遞迴演算法:
void
merge
(int a,
int*temp,
int l,
int r,
int rightend)
while
( l <= leftend )
temp[tmp++
]= a[l++];
while
( r <= rightend )
temp[tmp++
]= a[r++];
for( i=
0; i
++i,
--rightend )
a[rightend]
= temp[rightend];}
void
msort
(int a,
int*temp,
int l,
int rightend)
}void
merge_sort1
(int a,
int n)
}
非遞迴演算法:
void
merge
(int a,
int*temp,
int l,
int r,
int rightend)
while
( l <= leftend )
temp[tmp++
]= a[l++];
while
( r <= rightend )
temp[tmp++
]= a[r++];
for( i=
0; i
++i,
--rightend )
a[rightend]
= temp[rightend];}
void
merge_pass
(int a,
int*temp,
int n,
int length)
void
merge_sort2
(int a,
int n)
free
( temp );}
}
時間複雜度:t(n)=o(nlogn)
穩定性:穩定
九 排序(未完)
氣泡排序 o n 2 簡單選擇排序 o n 2 直接插入排序 o n 2 希爾排序 o n 1.3 堆排序 o nlogn 歸併排序 o nlogn 快速排序 o nlogn 影響排序演算法效能的因素 內排序 排序整個過程中,待排序列所有記錄全部放置在記憶體中 外排序 排序記錄多,不能同時放入記憶體...
09 排序1 排序
09 排序1 排序 25 分 給定n 個 長整型範圍內的 整數,要求輸出從小到大排序後的結果。本題旨在測試各種不同的排序演算法在各種資料情況下的表現。各組測試資料特點如下 include include includeusing namespace std const int cutoff 1000...
09 排序1 排序
n個 長整型範圍內的 整數,要求輸出從小到大排序後的結果。資料2 11個不相同的整數,測試基本正確性 資料3 10 3個隨機整數 資料4 10 4個隨機整數 資料5 10 5個隨機整數 資料6 10 5個順序整數 資料7 10 5個逆序整數 資料8 10 5個基本有序的整數 資料9 10 5個隨機正...