用Python,Java和C/C++实现的选择排序算法
时间:2020-02-23 14:41:51 来源:igfitidea点击:
选择排序算法对数组的元素进行排序。
在本文中,我们将研究核心算法以及如何在Python,Java,C++和C中实现它。
核心算法
选择排序算法非常简单。
首先设置i = 0,因为那是起点。
查找未排序子数组[i..end]的最小元素
然后,我们将其与a [i]位置的元素交换。
然后,我们增加i,并重复上述步骤,直到i == n
用伪代码,我们可以这样表示:
PROCEDURE SELECTION_SORT(arr): i = -1 while i < size(arr): idx = find_min(arr[i+1..size(arr)]) swap(i, idx) i++ return arr
显示算法的工作
现在,将其应用于数组,以了解该算法的工作原理!
让我们考虑以下数组。
最初,未排序的数组如下所示:
选择排序开始
在第一次迭代中,我们从剩余的数组(来自{12,7,6,6,16,4})中找到了最小元素4。
现在,我们将arr [i]与4交换。
选择排序迭代1
在下一次迭代中,我们从子数组{7,6,16,12}中找到最小元素,即6。
因此,让我们交换6和7。
选择排序迭代2
现在,我们移至更新数组的下一个元素,并再次执行相同的步骤。
选择排序迭代3
在上一次迭代中,没有变化,因为7是其余子数组中的最小元素。
选择排序迭代4
现在终于到了数组的末尾,现在已经对整个数组进行了排序!
让我们应用选择排序算法对上述数组进行Python,C++和C排序。
选择在Python中排序
以下代码段显示了使用Python的算法的工作方式。
def find_min(arr, start, end): minimum = arr[start] min_idx = start for idx in range(start, end): if arr[idx] < minimum: minimum = arr[idx] min_idx = idx return min_idx def selection_sort(arr): i = 0 arr_size = len(arr) while i < arr_size: # Find minimum of remaining unsorted subarray min_idx = find_min(arr, i, arr_size) # Swap with arr[i] arr[min_idx], arr[i] = arr[i], arr[min_idx] i += 1 return arr a = [12, 7, 6, 16, 4] print(selection_sort(a))
输出
[4, 6, 7, 12, 16]
选择Java排序
public class SelectionSort { int find_min(int arr[], int start, int end) { int min_idx = start; int minimum = arr[start]; for (int i=start; i<end; i++) { if (arr[i] < minimum) { min_idx = i; minimum = arr[i]; } } return min_idx; } void selection_sort(int arr[], int arr_len) { //Selection Sort on an Array //Pass by reference int start = 0; int min_idx; while (start < arr_len) { min_idx = find_min(arr, start, arr_len); //Swap arr[start] and arr[min_idx] int temp = arr[start]; arr[start] = arr[min_idx]; arr[min_idx] = temp; start++; } } public static void main(String[] args) { int arr[] = {12, 7, 6, 16, 4}; SelectionSort sel_sort = new SelectionSort(); sel_sort.selection_sort(arr, 5); System.out.println("Array after sorting:"); for (int i=0; i<5; i++) { System.out.printf("%d ", arr[i]); } System.out.println(); } }
将上面的代码另存为SelectionSort.java。
输出
Array after sorting: 4 6 7 12 16
选择在C++中排序
这是C++中算法的另一种实现
#include <iostream> using namespace std; int find_min(int arr[], int start, int end) { int min_idx = start; int minimum = arr[start]; for (int i=start; i<end; i++) { if (arr[i] < minimum) { min_idx = i; minimum = arr[i]; } } return min_idx; } void selection_sort(int arr[], int arr_len) { //Selection Sort on an Array //Pass by reference int start = 0; int min_idx; while (start < arr_len) { min_idx = find_min(arr, start, arr_len); //Swap arr[start] and arr[min_idx] int temp = arr[start]; arr[start] = arr[min_idx]; arr[min_idx] = temp; start++; } } int main() { int arr[] = {12, 7, 6, 16, 4}; selection_sort(arr, 5); cout << "Array after sorting:\n"; for (int i=0; i<5; i++) { cout << arr[i] << " "; } cout << endl; return 0; }
输出
Array after sorting: 4 6 7 12 16
在C语言中实现选择排序
#include <stdio.h> int find_min(int arr[], int start, int end) { int min_idx = start; int minimum = arr[start]; for (int i=start; i<end; i++) { if (arr[i] < minimum) { min_idx = i; minimum = arr[i]; } } return min_idx; } void selection_sort(int arr[], int arr_len) { //Selection Sort on an Array int start = 0; int min_idx; while (start < arr_len) { min_idx = find_min(arr, start, arr_len); //Swap arr[start] and arr[min_idx] int temp = arr[start]; arr[start] = arr[min_idx]; arr[min_idx] = temp; start++; } } int main() { int arr[] = {12, 7, 6, 16, 4}; selection_sort(arr, 5); printf("Array after sorting:\n"); for (int i=0; i<5; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; }
输出
Array after sorting: 4 6 7 12 16
时间复杂度
由于该算法对数组执行2个循环,因此其时间复杂度为O(n ^ 2)。
如果不清楚,则表示数组执行的操作总数为" n"个元素:
(n +(n-1)+(n-2)+(n-3)+…+ 1)= n *(n + 1)/2 = O(n ^ 2)
因此,尽管这不是一个很好的排序算法,但它很容易实现,可用于对元素数量较少的数组进行排序。