1. 程式人生 > >【資料結構週週練】034 奇偶排序演算法原理詳解及程式碼分享

【資料結構週週練】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);
}

三、執行結果

這個演算法並不唯一,如果大家有更好的演算法,可以在下面分享,大家有什麼問題也可以在下面留言哦!!!