C语言如何用简单选择排序体现出等最后一次确定了才交换一次,用代码显示出来
时间: 2023-05-29 17:06:28 浏览: 33
以下是 C 语言简单选择排序的代码,其中体现了等最后一次确定了才交换一次的思想:
```c
void selectionSort(int arr[], int n) {
int i, j, minIndex, temp;
for (i = 0; i < n - 1; i++) {
minIndex = i;
for (j = i + 1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
if (minIndex != i) {
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
}
```
在上面的代码中,我们定义了一个变量 `minIndex` 来记录当前未排序部分中最小元素的下标。在内层循环中,我们先找到未排序部分中的最小元素,然后将其下标赋给 `minIndex`。如果 `minIndex` 不等于当前循环的下标 `i`,说明最小元素不是当前位置的元素,那么就将它和当前位置的元素交换。
这样的做法可以确保每次交换只在循环结束后进行,即等最后一次确定了才交换一次,从而提高了排序算法的效率。
相关问题
C语言如何用冒泡排序体现出只比较交换,但不移动,插入的过程,如何用代码体现出来
冒泡排序的过程中,每次比较两个相邻元素的大小,并根据需要交换它们的位置。如果我们只比较交换,但不移动,插入的过程,则可以记录下当前元素需要插入的位置,然后将其与该位置之前的元素进行交换,直到找到正确的位置为止。
以下是使用冒泡排序体现只比较交换,但不移动,插入过程的代码:
```
void bubbleSort(int arr[], int n) {
int i, j;
for (i = 0; i < n-1; i++) {
int flag = 0; // 用于记录是否有交换操作
int pos = i + 1; // 记录当前元素需要插入的位置
for (j = i; j >= 0; j--) {
if (arr[pos] < arr[j]) {
// 如果当前元素比前面的元素小,则交换它们的位置
int temp = arr[pos];
arr[pos] = arr[j];
arr[j] = temp;
flag = 1;
pos = j; // 更新当前元素的插入位置
}
}
if (flag == 0) { // 如果没有交换操作,则说明已经排好序,退出循环
break;
}
}
}
```
在上面的代码中,我们用pos记录当前元素需要插入的位置,然后在向前比较的过程中,如果发现当前元素比前面的元素小,则交换它们的位置,并更新pos的值。这样就能够实现只比较交换,但不移动,插入的过程。
请用c语言给我一个简单的选择排序代码
以下是一个简单的选择排序代码:
```c
#include <stdio.h>
void selectionSort(int arr[], int n)
{
int i, j, min_idx;
// 循环进行 n-1 轮选择排序
for (i = 0; i < n-1; i++)
{
// 找到当前未排序部分的最小值
min_idx = i;
for (j = i+1; j < n; j++)
if (arr[j] < arr[min_idx])
min_idx = j;
// 将最小值交换到已排序部分的末尾
int temp = arr[min_idx];
arr[min_idx] = arr[i];
arr[i] = temp;
}
}
int main()
{
int arr[] = {64, 25, 12, 22, 11};
int n = sizeof(arr)/sizeof(arr[0]);
selectionSort(arr, n);
printf("排序后的数组:\n");
for (int i=0; i < n; i++)
printf("%d ", arr[i]);
return 0;
}
```
输出:
```
排序后的数组:
11 12 22 25 64
```
该代码通过循环进行 n-1 轮选择排序,每一轮选择排序找到当前未排序部分的最小值,并将其交换到已排序部分的末尾。