演算法與資料結構——選擇排序(c++)
排序演算法
為什麼要學習O(n^2)的排序演算法?
基礎
- 編碼簡單,易於實現,是一些簡單情景的首選
- 在一些特殊情況下,簡單的排序演算法更有效
- 簡單的排序演算法思想衍生出複雜的排序演算法
- 作為子過程,改進更復雜的排序演算法
選擇排序——Selection Sort
依次在剩下的部分(當前還沒有排序的部分)找出最小的元素,與第一個調換位置。
#include <iostream>
using namespace std;
void selectionSort(int arr[] ,int n){
for(int i=0;i<n;i++){
//尋找[i,n)區間裡的最小值
int mid=i;
//找出未排序部分的最小值,將他的下標值賦給mid,將最小值的索引存在mid中
for(int j=i+1;j<n;j++){
if(arr[mid]>arr[j]){
mid=j;//更新mid
}
}
//找出最小值,此時mid的值就是其下標,交換
//交換函式swap(),c++標準庫中內建的函式,在名稱空間std中
swap(arr[i],arr[mid]);
}
}
int main() {
int a[10]={5,8,9,7,3,0,2,1,4,6};
selectionSort(a,10);
for(int i=0;i<10;i++){
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
只能對整形進行排序——改進:
main.cpp
#include <iostream>
#include "Student.h"
using namespace std;
//要排序的內容很多,所以使用模板函式(泛型)
template <typename T>
//出入的陣列為T型別
void selectionSort(T arr[] ,int n){
for(int i=0;i<n;i++){
//尋找[i,n)區間裡的最小值
int mid=i;
//找出未排序部分的最小值,將他的下標值賦給mid,將最小值的索引存在mid中
for(int j=i+1;j<n;j++){
if(arr[j]<arr[mid]){
mid=j;//更新mid
}
}
//找出最小值,此時mid的值就是其下標,交換
//交換函式swap(),c++標準庫中內建的函式,在名稱空間std中
swap(arr[i],arr[mid]);
}
}
int main() {
//傳入整型陣列
int a[10]={5,8,9,7,3,0,2,1,4,6};
//呼叫選擇排序函式
selectionSort(a,10);
//遍歷列印陣列
for(int i=0;i<10;i++){
cout<<a[i]<<" ";
}
cout<<endl;
// 測試模板函式,傳入浮點數陣列
float b[4] = {4.4,3.3,2.2,1.1};
selectionSort(b,4);
for( int i = 0 ; i < 4 ; i ++ )
cout<<b[i]<<" ";
cout<<endl;
// 測試模板函式,傳入字串陣列
string c[4] = {"D","C","B","A"};
selectionSort(c,4);
for( int i = 0 ; i < 4 ; i ++ )
cout<<c[i]<<" ";
cout<<endl;
// 測試模板函式,傳入自定義結構體Student陣列
Student d[4] = { {"D",90} , {"C",100} , {"B",95} , {"A",95} };
selectionSort(d,4);
for( int i = 0 ; i < 4 ; i ++ )
cout<<d[i];
cout<<endl;
return 0;
}
Student.h
//巨集定義
#ifndef SELECTIONSORT_STUDENT_H
#define SELECTIONSORT_STUDENT_H
//再此寫宣告和實現,開源專案.h檔案不對外隱藏,.cpp編譯後對外隱藏
#include <iostream>
#include <string>
using namespace std;
struct Student{
string name;
int score;
//運算子過載 <
bool operator<(const Student& otherStudent){
return score != otherStudent.score ?
score > otherStudent.score : name < otherStudent.name;
}
//友元函式 <<
friend ostream& operator<<(ostream &os, const Student &student){
os<<"Student: "<<student.name<<" "<<student.score<<endl;
return os;
}
};
#endif //SELECTIONSORT_STUDENT_H
用程式碼生成隨機用例:
SortTestHelper.h
//
// Created by administrator on 2019/2/2.
//
#ifndef SELECTIONSORT_SORTTESTHELPER_H
#define SELECTIONSORT_SORTTESTHELPER_H
#include <iostream>
#include <ctime>
#include <cassert>
using namespace std;
namespace SortTestHelper {
// 生成有n個元素的隨機陣列,每個元素的隨機範圍為[rangeL, rangeR]
int *generateRandomArray(int n, int rangeL, int rangeR) {
assert(rangeL <= rangeR);
int *arr = new int[n];
srand(time(NULL));
for (int i = 0; i < n; i++)
arr[i] = rand() % (rangeR - rangeL + 1) + rangeL;
return arr;
}
template<typename T>
void printArray(T arr[], int n) {
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
cout << endl;
return;
}
};
#endif //SELECTIONSORT_SORTTESTHELPER_H
main.cpp
#include <iostream>
#include "SortTestHelper.h"
using namespace std;
template<typename T>
void selectionSort(T arr[], int n){
for(int i = 0 ; i < n ; i ++){
int minIndex = i;
for( int j = i + 1 ; j < n ; j ++ )
if( arr[j] < arr[minIndex] )
minIndex = j;
swap( arr[i] , arr[minIndex] );
}
}
int main() {
// 測試排序演算法輔助函式
int N = 10000;
int *arr = SortTestHelper::generateRandomArray(N,0,100000);
selectionSort(arr,N);
SortTestHelper::printArray(arr,N);
delete[] arr;
return 0;
}
相關文章
- 資料結構與演算法——排序演算法-選擇排序資料結構演算法排序
- 資料結構32:選擇排序資料結構排序
- 演算法與資料結構系列 ( 三 ) - 選擇排序法- Select Sort演算法資料結構排序
- 資料結構和演算法:03.冒泡、選擇排序資料結構演算法排序
- 看圖輕鬆理解資料結構與演算法系列(選擇排序)資料結構演算法排序
- 從零開始學資料結構和演算法(一)冒泡與選擇排序資料結構演算法排序
- 資料結構與演算法——排序資料結構演算法排序
- 重學資料結構和演算法(四)之氣泡排序、插入排序、選擇排序資料結構演算法排序
- 資料結構與演算法(八):排序資料結構演算法排序
- 資料結構與演算法之排序資料結構演算法排序
- 資料結構與演算法:堆排序資料結構演算法排序
- 【資料結構與演算法】堆排序資料結構演算法排序
- 資料結構與演算法——堆排序資料結構演算法排序
- 資料結構與演算法----# 一、排序資料結構演算法排序
- [資料結構與演算法] 排序演算法資料結構演算法排序
- 資料結構與演算法——排序演算法-歸併排序資料結構演算法排序
- 資料結構與演算法——排序演算法-基數排序資料結構演算法排序
- 資料結構與演算法——排序演算法-氣泡排序資料結構演算法排序
- 資料結構與演算法 排序與搜尋資料結構演算法排序
- 資料結構學習筆記-簡單選擇排序資料結構筆記排序
- 資料結構與演算法 基礎排序資料結構演算法排序
- 資料結構與演算法 進階排序資料結構演算法排序
- Java資料結構與排序演算法 (三)Java資料結構排序演算法
- Java資料結構與排序演算法 (一)Java資料結構排序演算法
- Java資料結構與排序演算法 (二)Java資料結構排序演算法
- 資料結構與演算法-反轉排序資料結構演算法排序
- 【資料結構與演算法】歸併排序資料結構演算法排序
- 資料結構與演算法之快速排序資料結構演算法排序
- 資料結構與演算法整理總結---排序 2資料結構演算法排序
- 資料結構與排序資料結構排序
- 【圖解資料結構】 一組動畫演示選擇排序圖解資料結構動畫排序
- 資料結構與演算法——十個排序演算法資料結構演算法排序
- 【演算法與資料結構】經典排序演算法總結演算法資料結構排序
- 演算法與資料結構之原地堆排序演算法資料結構排序
- 演算法與資料結構基礎 - 排序(Sort)演算法資料結構排序
- python演算法與資料結構-快速排序(36)Python演算法資料結構排序
- 演算法與資料結構高階排序演算法之歸併排序演算法資料結構排序
- 排序演算法:選擇排序排序演算法