- 原理
现有 3,7,4,2,6,1 六个数字,从小到大排序时,先假设第一个数 3 为数组的最大值,最大值下标为 0,然后和剩余的数比较大小,若比当前的最大值大,则更新最大值的位置。如:3,7 比较,7 比较大最大值的下标为1。4,7 比较,7比较大则最大值的下标还是为1。2,7 比较,7比较大则最大值的下标还是为1…然后将 7 与数组最后一位互换位置,这样就确定了当前数组的最后一位,之后**不断减少数组长度,直到为 1,还不理解的看 视频讲解原理🖱️
- 代码
/* 找最大值位置的函数 */
int findMax(int arr[],int n){
int max=arr[0]; //假设第一个值为最大值
int pos=0; //用 pos 记录最大值的下标
for(int i=0;i<n;i++){
if(arr[i]>max){ //若arr[i]大于当前的最大值
max=arr[i]; //更新最大值
pos=i; //更新最大值的下标
}
}
return pos;
}
void selectionSort(int arr[],int n){
/* 主体部分:将当前最大值与当前数组的最后位互换 */
for(n;n>=1;n--){ //不断减小数组长度,直到为 1
int pos=findMax(arr,n);
int temp=arr[pos];
arr[pos]=arr[n-1];
arr[n-1]=temp;
}
}
// 关键点:找最大值的位置,放于数组最后一位
- 复杂度
时间复杂度:O(n2)
空间复杂度:O(1)
- 实践
#include<stdio.h>
void selectionSort(int arr[], int n);
int main() {
int arr[7] = { 1,6,4,7,2,0,7 };
selectionSort(arr, 7);
for (int i = 0; i < 7; i++) {
printf("%d,", arr[i]);
}
}
int findMax(int arr[], int n) {
int max = arr[0];
int pos = 0;
for (int i = 0; i < n; i++) {
if (arr[i] > max) {
max = arr[i];
pos = i;
}
}
return pos;
}
void selectionSort(int arr[], int n) {
for (n; n >= 1; n--) {
int pos = findMax(arr, n);
int temp = arr[pos];
arr[pos] = arr[n - 1];
arr[n - 1] = temp;
}
}
运行结果: