我有一個任務來修改選擇排序以按升序對陣列奇數位置上的所有值進行排序,并按降序對偶數位置上的所有值進行排序。我目前正在研究oddSort 函式
void oddSort(int arrSize, int arr[]){
int i;
int lastOdd;
int currentMin;
lastOdd = findLastOdd(arrSize);
for(i=0; i<lastOdd; i =2){
if(i=0){
currentMin = arr[i];
}
else if (arr[i] < currentMin){
swap(&arr[i], ¤tMin);
}
}
}
但是,當我嘗試將此函式應用于陣列并為其列印輸出時,編譯器不會回傳任何內容。
int main(){
int arrayOne[10] = {246, 101, 223, 228, 1, 249, 99, 111, 191, 126};
int i;
oddSort(10, arrayOne);
for(i=0; i<10; i ){
printf("%d ", arrayOne[i]);
}
return 0;
}
evenSort 函式的偽代碼類似于oddSort 函式,所以我假設它也不起作用。我獨立檢查了 swap 和 findLastOdd 函式,它們可以作業,所以我確信oddSort 函式本身有問題。關于什么的任何想法?編輯:這是我的代碼中其余的用戶定義函式
int findLastOdd(int someNumber){//to give the oddSort function a stopping point
if(someNumber % 2 == 0){
return someNumber - 1;
}
else{
return someNumber;
}
}
int findLastEven(int someNumber){//to give the evenSort function a starting point
if(someNumber % 2 == 0){
return someNumber;
}
else{
return someNumber - 1;
}
}
void swap (int* a, int* b){// swaps two array elements using pointers
int temp;
temp = *a;
*b = *a;
*b = temp;
}
uj5u.com熱心網友回復:
對于初學者來說,不需要將排序陣列的函式拆分為兩個單獨的函式。
在 if 陳述句中的函式 oddSort 內
if(i=0){
您使用的是賦值=運算子而不是比較運算子==。而且奇數索引1不是從開始的0。
并且使用選擇排序方法僅使用一個回圈對陣列進行排序是不夠的。
甚至你的單個 for 回圈中的條件
for(i=0; i<lastOdd; i =2){
不正確,因為索引的值lastOdd可以是陣列元素的有效索引位置。
并且函式 swap 包含一個錯字。代替
int temp;
temp = *a;
*b = *a;
*b = temp;
必須有
int temp;
temp = *a;
*a = *b;
*b = temp;
這是一個演示程式,展示了如何撰寫排序函式。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void OddEvenSort( int a[], size_t n )
{
for ( size_t i = 0; i < n; i )
{
size_t target = i;
for ( size_t j = i; j < n && j < n ; )
{
if ( i % 2 == 0 )
{
if ( a[target] < a[j] ) target = j;
}
else
{
if ( a[j] < a[target] ) target = j;
}
}
if ( target != i )
{
int tmp = a[i];
a[i] = a[target];
a[target] = tmp;
}
}
}
int main( void )
{
enum { N = 20 };
int a[N];
srand( ( unsigned int )time( NULL ) );
for ( size_t i = 0; i < N; i )
{
a[i] = rand() % N;
}
for ( size_t i = 0; i < N; i )
{
printf( "%d ", a[i] );
}
putchar( '\n' );
OddEvenSort( a, N );
for ( size_t i = 0; i < N; i )
{
printf( "%d ", a[i] );
}
putchar( '\n' );
}
程式輸出可能看起來像
11 11 14 4 11 17 18 4 12 6 16 8 15 10 9 7 13 9 4 15
18 4 16 4 15 6 14 7 13 8 12 9 11 10 11 11 9 15 4 17
如您所見,偶數位置的值按降序排序
18 16 15 14 13 12 11 11 9 4
并且奇數位置的值按升序排序
4 4 6 7 8 9 10 11 15 17
uj5u.com熱心網友回復:
請注意,在您的函式oddSort中,您似乎在 o(logn) 運行時對陣列的奇數進行排序,但不可能在 o(logn) 中對 o(n/2)=o(n) 個元素進行排序。事實上,排序的最短運行時間是o(nlogn)。
uj5u.com熱心網友回復:
int findLastOdd(int someNumber){//to give the oddSort function a stopping point
if(someNumber % 2 == 0){
return someNumber - 1;
}
else{
return someNumber;
}
}
void swap (int* a, int* b){// swaps two array elements using pointers
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int findMinValue(const int* arr, int startIndex, int arrSize) {
int min = startIndex;
for (int i = startIndex; i < arrSize; i = 2) {
if (arr[i] < arr[min]) min = i;
}
return min;
}
void oddSort(int arrSize, int* arr){
int i;
int lastOdd;
int currentMin;
lastOdd = findLastOdd(arrSize);
for(i=1; i<lastOdd; i =2){
currentMin = findMinValue(arr, i, arrSize);
swap(&arr[currentMin], &arr[i]);
}
}
int main(){
int arrayOne[10] = {246, 101, 223, 228, 1, 249, 99, 111, 191, 126};
int i;
oddSort(10, arrayOne);
for(i=0; i<10; i ){
printf("%i: %d\n", i, arrayOne[i]);
}
return 0;
}
在交換函式中,您混淆了變數。此外,oddSort() 中的 if 陳述句也有語法錯誤。您將 0 分配給 i,而不是使用 == 實際檢查 i 是否等于 0。
在選擇排序中,您需要迭代陣列并找到您能找到的最小值。您回傳該元素的索引,然后將當前元素與最小的元素交換。您顯然忘記了這一步,所以我為您創建了函式 findMinValue()。
您可以自己完成代碼并使其更漂亮/擺脫一些低效率,但我在上面發布的代碼有效(在我的機器上:^))。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/485098.html
下一篇:c中的stride是什么
