之前給大家分享了排序演算法裡面比較簡單的氣泡排序,今天來分享一下選擇排序的演算法
選擇排序的思想:
1.(以公升序為例)在一組數中選出最大的數放到第乙個位置,或者選出最小的數放到最後乙個位置,
2.在選取剩餘元素的最大數放到第二個位置,或選出剩餘元素中的最小值放到倒數第二哥位置,
3.依次往下選取,直到遍歷完陣列為止。
具體步驟如圖所示:
**實現:
void selectsort(int *a, size_t size)
} tmp = a[min];//找到最小元素把它交換到相應位置上去
a[min] = a[i];
a[i] = tmp;
}}
這樣就實現了選擇排序,但它還不夠高效,我們可以考慮,每次遍歷陣列的時候可以選擇出最大和最小兩個元素,(假設為公升序),把最小元素放到最前面,把最大元素放到最後面。再縮小排序範圍為a[1]到a[size-2],遍歷陣列,找出最大元素和最小元素,放到相應位置,直到排序範圍縮小至0,就可以結束了
優化:每次遍歷找出最大和最小
如下圖所示:
**實現:
void selectsort(int *a, size_t size)
if (a[max] < a[j])
}//_swap(a[min], a[i]);
tmp = a[min];
a[min] = a[i];
a[i] = tmp;
tmp = a[max];
a[max] = a[size - 1];
a[size - 1] = tmp;
}}
很多人會把冒泡和選擇弄混,所以在最後呢,我會來分析一下選擇排序和氣泡排序的區別:
氣泡排序是用第乙個元素和後面的元素進行比較,把最大的交換到最後面的位置去。氣泡排序演算法在有序或接近有序是最優,它的時間複雜度為o(n^2)。
選擇排序呢是選出最大元素的下標,再根據下標將最大元素和最後面的元素交換。它的時間複雜度為o(n)。
好了,後面還會有一系列的排序演算法,學的失火一定要記清楚他們的區別,不要把他們弄混了。
排序演算法 二 選擇排序
演算法實現 selectsort.c include void selectsort int arr,int len if min i for k 0 k演算法思想 保證將要成為有序範圍內的那個位置的值是無序裡的最小值。ex 從陣列選出最小的放在第乙個位置上,在從剩餘陣列選出最小放在第二個位置上,以...
排序演算法(二) 選擇排序
選擇排序是一種簡單的直觀的排序演算法,基本原理如下 對於給定的一組記錄,經過一輪比較後得到最小的記錄,然後將該記錄的位置與第乙個記錄的位置交換 接著對不包括第乙個記錄以外的其他記錄進行第二次比較,得到最小記錄並與第二個位置記錄交換,重複該過程,直到進行比較的記錄只剩下乙個為止 從簡單排序的過程來看,...
排序演算法二 選擇排序
首先來看一下簡單選擇排序 思想 在未排序的序列中選出最小的元素和當前序列的第乙個元素互換,然後在剩下的元素中選出乙個與剩下元素的第乙個位置互換,依次交換,最後就會形成乙個從小到大的已排序序列。void selectsort int a,int n 迴圈完一遍 已找到最小元素 交換 a i a i a...