選擇、冒泡排序法C++實現


選擇排序法

一開始把選擇排序法理解錯了。於是寫出如下代碼:

#include<iostream>
using namespace std;

void comp(int *ptr1, int *ptr2){
++cnt0;
int sw = 0;
if (*ptr1 > *ptr2){
sw = *ptr1;
*ptr1 = *ptr2;
*ptr2 = sw;
++cnt;
}
}
int main(){
int cnt = 0,cnt0=0;
int a[10] = { 2, 3, 1, 5, 4, 3, 5, 4, 2, 8 };
int *p = a;
cout << "排序前:" << endl;
for (int i = 0; i < 10;i++)
cout << a[i] << " ";
cout << endl;
for (int i = 0; i < 10; i++){
for (int j = i + 1; j < 10; j++){
comp(p + i, p + j);
for (int se = 0; se < 10; se++)
cout << a[se] << " ";
cout << endl;
}
}
cout << "排序后:" << endl;
for (int i = 0; i < 10; i++)
cout << a[i] << " ";
cout << endl;
cout << "循環次數:" << cnt0 << endl;
cout <<"交換次數:"<< cnt << endl;
return 0;
}

該代碼的運作如下:

  1. 比較第一個位置與后面位置元素的大小。只要第一個位置元素比后面位置元素大就交換它們。第一個位置的值在動態改變。
  2. 比較第二個位置與后面位置元素的大小。只要第二個位置元素比后面位置元素大就交換它們。
  3. 依次,直到最后一個位置,排序結束。

感覺這就是選擇和冒泡的雜交版本。

但其實真正的選擇排序應該是這樣的:

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再從剩余未排序元素中繼續尋找最小(大)元素,然后放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。 —— [ 維基百科 ]

選擇排序的示例動畫。紅色表示當前最小值,黃色表示已排序序列,藍色表示當前位置

代碼如下:

#include<iostream>
using namespace std;

//選擇法
int main(){
int cnt = 0, cnt0 = 0;//定義交換次數和循環的次數
int a[10] = { 2, 3, 1, 7, 0, 6, 5, 4, 9, 8 };
//輸出排序前序列
cout << "排序前:" << endl;
for (int i = 0; i < 10; i++)
cout << a[i] << " ";
cout << endl;
//選擇法進行排序
cout << "每輪交換后序列:" << endl;
for (int i = 0; i < 10; i++){
int min = a[i], labeli = i;//定義每輪初始最小值及其下標
for (int j = i + 1; j < 10; j++){
if (min > a[j]){//尋找每輪的最小值並記下下標
min = a[j];
labeli = j;
}
++cnt0;//循環次數
}
a[labeli] = a[i];//將i位置的值放在最小值所在的位置上
a[i] = min;//將最小值放在i位置上
//輸出該輪交換后的序列
cout << "第" << ++cnt << "次交換后:\n";//cnt:交換次數
for (int se = 0; se < 10; se++)
cout << a[se] << " ";
cout << endl;
}
//輸出選擇排序后結果
cout << "排序后:" << endl;
for (int i = 0; i < 10; i++)
cout << a[i] << " ";
cout << endl;
cout << "循環次數:" << cnt0 << endl;
cout << "交換次數:" << cnt << endl;
return 0;
}

其中需要對尋找到的最小值進行下標標記。


冒泡排序算法

冒泡排序算法的運作如下:
1、比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
2、對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。這步做完后,最后的元素會是最大的數。
3、針對所有的元素重復以上的步驟,除了最后一個。
4、持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。
—— [ 維基百科 ]

代碼如下(來自維基百科):

#include <iostream>
#include <algorithm>
using namespace std;
template<typename T> //整數或浮點數皆可使用,若要使用物件(class)時必須設定大於(>)的運算子功能
void bubble_sort(T arr[], int len) {
int i, j;
for (i = 0; i < len - 1; i++)
for (j = 0; j < len - 1 - i; j++)
if (arr[j] > arr[j + 1])
swap(arr[j], arr[j + 1]);
}
int main() {
int arr[] = { 61, 17, 29, 22, 34, 60, 72, 21, 50, 1, 62 };
int len = (int) sizeof(arr) / sizeof(*arr);
bubble_sort(arr, len);
for (int i = 0; i < len; i++)
cout << arr[i] << ' ';
cout << endl;
float arrf[] = { 17.5, 19.1, 0.6, 1.9, 10.5, 12.4, 3.8, 19.7, 1.5, 25.4, 28.6, 4.4, 23.8, 5.4 };
len = (int) sizeof(arrf) / sizeof(*arrf);
bubble_sort(arrf, len);
for (int i = 0; i < len; i++)
cout << arrf[i] << ' ';
return 0;
}

排序相關的算法有很多,還有算法的評價指標。日后一點點補上。
來自維基百科


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: