我用C编写了这个排序算法。它在每次迭代时都会查找带有最大值的元素,并将其添加到数组的末尾,并与其他较小的元素交换。这样,通过几乎n交换,就可以对n元素数组进行排序。
#include <stdio.h>
int max(int arr1[],int l){
int max = 0;
for(int i = 0; i <= l;i++)
max = (arr1[i] > arr1[max]) ? (i) : (max);
return max;
}
void swap(int arr[], int a,int b){
if(arr[a] != arr[b]){
arr[a] += arr[b];
arr[b] = arr[a] - arr[b];
arr[a] -= arr[b];
}
}
int main(){
int arr[] = {1,5,7,2,8,9,10,32,4};
int len = sizeof(arr) / sizeof(arr[0]);
for(int i = 0; i < len; i++)
swap(arr,(len - i - 1),max(arr,(len - i -1)));
printf("\nSorted Array:\n");
for(int i = 0; i < len;i++)
printf("%d ",arr[i]);
}任何建议/建设性的批评都是非常欢迎的。我是初学者,请指出我犯的任何错误。
发布于 2022-05-31 11:06:37
我发现您的代码不够清晰,至少在我看来是如此,这主要是由于命名方面的问题。
max()不返回最大值,而是返回最大值的索引。一个更有意义的名字将有助于可读性。
swap()使用一种相当缺乏表现力的方法交换数组中的两个条目--中间int与之交换值有什么问题?
您可以按自己的方式工作,但是使用基于增量的循环。
我会让其他人来批评实际的排序算法,不过我不知道在数组实际排序之后是否可以提供早期退出。
我手头没有C编译器,但下面是我使用Java进行的修订的草图,在本例中,这可能已经足够接近说明了。
package codeReview;
import java.util.Arrays;
public class MaxSort {
private static int indexOfMaxElement(int arr1[], int limit) {
int maxIndex = 0;
for (int i = 0; i <= limit; i++) {
maxIndex = (arr1[i] > arr1[maxIndex]) ? (i) : (maxIndex);
}
return maxIndex;
}
private static void swap(int arr[], int limit, int maxIndex) {
if (arr[limit] != arr[maxIndex]) {
int swap = arr[limit];
arr[limit] = arr[maxIndex];
arr[maxIndex] = swap;
}
}
public static void main(String[] args) {
int array[] = {1, 5, 7, 2, 8, 8, 9, 10, 32, 4, 4};
int len = array.length;
for (int limit = len-1; limit > 0; limit--) {
swap(array, limit, indexOfMaxElement(array, limit));
}
System.out.println("Sorted Array:");
System.out.println(Arrays.toString(array));
}
}https://codereview.stackexchange.com/questions/276977
复制相似问题