用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)
因此,尽管这不是一个很好的排序算法,但它很容易实现,可用于对元素数量较少的数组进行排序。

