【資料結構週週練】034 奇偶排序演算法原理詳解及程式碼分享
一、氣泡排序
1、奇偶排序簡介
奇偶排序演算法不是嚴蔚敏老師書上的演算法,是今年某高校考研的一道考試題,聽朋友說了之後感覺很不錯,給大家分享一下。
題目大致含義如下:
已知奇偶交換排序如下所述:
1.第一趟對序列中所有奇數項i掃描,將a[i]和a[i+1]進行比較;
2.第二趟對序列中所有偶數項i掃描,將a[i]和a[i+1]進行比較。
3.每次比較時若 a[i]>a[i+1],則將兩者交換。
4.第三趟對所有奇數項,第四趟對所有偶數項……,如此重複,直至整個序列有序。
5.寫出奇偶交換排序演算法
2、演算法思想及流程
這個演算法原理是也是比較簡單的,接下來就給大家分享一下我的做法。以下面這幾個資料來模擬方便大家理解:
給定一組資料如下:1,3,5,2,8,6,4,7
第一趟排序,對所有奇數項掃描,如果比後一項大,交換:
[1,3],[5,2],[8,6],[4,7] => [1,3],[2,5],[6,8],[4,7]
第二趟排序,對所有偶數項掃描,如果比後一項大,交換:
1,[3,2],[5,6],[8,4],7 => 1,[2,3],[5,6],[4,8],7
第三趟排序,對所有奇數項掃描,如果比後一項大,交換:
[1,2],[3,5],[6,4],[8,7] => [1,2],[3,5],[4,6],[7,8]
第四趟排序,對所有偶數項掃描,如果比後一項大,交換:
1,[2,3],[5,4],[6,7],8 => 1,[2,3],[4,5],[6,7],8
通過這個分析,我想大家對這個;排序過程應該有比較深刻的瞭解了,我們會注意到兩個問題:
1,一串資料可能有奇數個,可能有偶數個,怎麼保證它不訪問最後一個,導致出錯呢?
答:我們可以通過設定循範圍,當迴圈變數到總個數-1時,停止迴圈。
2,我們人眼能分辨到第四趟停止,計算機怎麼實現呢?
答:我們設定兩個中間變數m,n來控制,如果奇排序過程中有元素交換,m為1,否則為0;如果偶排序過程中有元素交換,n為1,否則為0。當mn同時為0時,說明奇偶都沒有交換,這個時候說明資料有序。
接下來分享我的全部程式碼。
二、全部程式碼
剛才上面是分析,接下來我將所有的程式碼分享一下。為了更好的看效果,我找了奇數個數字(因為示例是偶數個數字),並且換了一組數字來測試。
#include<iostream>
using namespace std;
void Sort(int Arr[], int length) {
int temp;
int m = 1;
int n = 1;
while (m||n)
{
for (int i = 0; i < length - 1; i = i + 2)
{
if (Arr[i] > Arr[i + 1])
{
temp = Arr[i];
Arr[i] = Arr[i + 1];
Arr[i + 1] = temp;
m = 1;
}
else
m = 0;
}
for (int j = 1; j < length - 1; j = j + 2)
{
if (Arr[j] > Arr[j + 1])
{
temp = Arr[j];
Arr[j] = Arr[j + 1];
Arr[j + 1] = temp;
m = 1;
}
else
n = 0;
}
}
}
void OutputArr(int Arr[], int length) {
for (int i = 0; i < length; i++)
{
cout << Arr[i] << ", ";
}
cout << endl;
}
void main() {
int Arr[] = { 45,57,12,31,1,60,92,71,87 };
Sort(Arr, 9);
OutputArr(Arr, 9);
}
三、執行結果
這個演算法並不唯一,如果大家有更好的演算法,可以在下面分享,大家有什麼問題也可以在下面留言哦!!!