java选择排序解释_选择排序
號(hào)內(nèi)回復(fù)數(shù)據(jù)結(jié)構(gòu),獲取整套算法視頻
本文作者:skywang12345
歡迎點(diǎn)擊下方閱讀原文
選擇排序介紹
選擇排序(Selection sort)是一種簡單直觀的排序算法。
它的基本思想是:首先在未排序的數(shù)列中找到最小(or最大)元素,然后將其存放到數(shù)列的起始位置;接著,再從剩余未排序的元素中繼續(xù)尋找最小(or最大)元素,然后放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。
選擇排序圖文說明
選擇排序代碼
/*
* 選擇排序
*
* 參數(shù)說明:
* ? ? a -- 待排序的數(shù)組
* ? ? n -- 數(shù)組的長度
*/
void select_sort(int a[], int n){
int i; ? ? ? ?// 有序區(qū)的末尾位置
int j; ? ? ? ?// 無序區(qū)的起始位置
int min; ? ?// 無序區(qū)中最小元素位置
for(i=0; i
{
min=i;
// 找出"a[i+1] ... a[n]"之間的最小元素,并賦值給min。
for(j=i+1; j
{
if(a[j] < a[min])
min=j;
}
// 若min!=i,則交換 a[i] 和 a[min]。
// 交換之后,保證了a[0] ... a[i] 之間的元素是有序的。
if(min != i)
swap(a[i], a[min]);
}
}
下面以數(shù)列{20,40,30,10,60,50}為例,演示它的選擇排序過程(如下圖)。
排序流程
第1趟:i=0。找出a[1...5]中的最小值a[3]=10,然后將a[0]和a[3]互換。 數(shù)列變化:20,40,30,10,60,50 -- > 10,40,30,20,60,50
第2趟:i=1。找出a[2...5]中的最小值a[3]=20,然后將a[1]和a[3]互換。 數(shù)列變化:10,40,30,20,60,50 -- > 10,20,30,40,60,50
第3趟:i=2。找出a[3...5]中的最小值,由于該最小值大于a[2],該趟不做任何處理。
第4趟:i=3。找出a[4...5]中的最小值,由于該最小值大于a[3],該趟不做任何處理。
第5趟:i=4。交換a[4]和a[5]的數(shù)據(jù)。 數(shù)列變化:10,20,30,40,60,50 -- > 10,20,30,40,50,60
選擇排序的時(shí)間復(fù)雜度和穩(wěn)定性
選擇排序時(shí)間復(fù)雜度
選擇排序的時(shí)間復(fù)雜度是O(N2)。
假設(shè)被排序的數(shù)列中有N個(gè)數(shù)。遍歷一趟的時(shí)間復(fù)雜度是O(N),需要遍歷多少次呢?N-1!因此,選擇排序的時(shí)間復(fù)雜度是O(N2)。
選擇排序穩(wěn)定性
選擇排序是穩(wěn)定的算法,它滿足穩(wěn)定算法的定義。
算法穩(wěn)定性 -- 假設(shè)在數(shù)列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。則這個(gè)排序算法是穩(wěn)定的!
選擇排序?qū)崿F(xiàn)
選擇排序C實(shí)現(xiàn)
實(shí)現(xiàn)代碼(select_sort.c)
/**
* 選擇排序:C 語言
*
* @author skywang
* @date 2014/03/11
*/
#include
// 數(shù)組長度
#define LENGTH(array) ( (sizeof(array)) / (sizeof(array[0])) )
#define swap(a,b) (a^=b,b^=a,a^=b)
/*
* 選擇排序
*
* 參數(shù)說明:
* ? ? a -- 待排序的數(shù)組
* ? ? n -- 數(shù)組的長度
*/
void select_sort(int a[], int n){
int i; ? ? ? ?// 有序區(qū)的末尾位置
int j; ? ? ? ?// 無序區(qū)的起始位置
int min; ? ?// 無序區(qū)中最小元素位置
for(i=0; i
{
min=i;
// 找出"a[i+1] ... a[n]"之間的最小元素,并賦值給min。
for(j=i+1; j
{
if(a[j] < a[min])
min=j;
}
// 若min!=i,則交換 a[i] 和 a[min]。
// 交換之后,保證了a[0] ... a[i] 之間的元素是有序的。
if(min != i)
swap(a[i], a[min]);
}
}
void main(){
int i;
int a[] = {20,40,30,10,60,50};
int ilen = LENGTH(a);
printf("before sort:");
for (i=0; i
printf("%d ", a[i]);
printf("n");
select_sort(a, ilen);
printf("after ?sort:");
for (i=0; i
printf("%d ", a[i]);
printf("n");
}
選擇排序C++實(shí)現(xiàn)
實(shí)現(xiàn)代碼(SelectSort.cpp)
/**
* 選擇排序:C++
*
* @author skywang
* @date 2014/03/11
*/
#include
using namespace std;
/*
* 選擇排序
*
* 參數(shù)說明:
* ? ? a -- 待排序的數(shù)組
* ? ? n -- 數(shù)組的長度
*/
void selectSort(int* a, int n){
int i; ? ? ? ?// 有序區(qū)的末尾位置
int j; ? ? ? ?// 無序區(qū)的起始位置
int min; ? ?// 無序區(qū)中最小元素位置
for(i=0; i
{
min=i;
// 找出"a[i+1] ... a[n]"之間的最小元素,并賦值給min。
for(j=i+1; j
{
if(a[j] < a[min])
min=j;
}
// 若min!=i,則交換 a[i] 和 a[min]。
// 交換之后,保證了a[0] ... a[i] 之間的元素是有序的。
if(min != i)
{
int tmp = a[i];
a[i] = a[min];
a[min] = tmp;
}
}
}
int main(){
int i;
int a[] = {20,40,30,10,60,50};
int ilen = (sizeof(a)) / (sizeof(a[0]));
cout << "before sort:";
for (i=0; i
cout << a[i] << " ";
cout << endl;
selectSort(a, ilen);
cout << "after ?sort:";
for (i=0; i
cout << a[i] << " ";
cout << endl;
return 0;
}
選擇排序Java實(shí)現(xiàn)
實(shí)現(xiàn)代碼(SelectSort.java)
/**
* 選擇排序:Java
*
* @author skywang
* @date 2014/03/11
*/
public class SelectSort {
/*
* 選擇排序
*
* 參數(shù)說明:
* ? ? a -- 待排序的數(shù)組
* ? ? n -- 數(shù)組的長度
*/
public static void selectSort(int[] a, int n){
int i; ? ? ? ?// 有序區(qū)的末尾位置
int j; ? ? ? ?// 無序區(qū)的起始位置
int min; ? ?// 無序區(qū)中最小元素位置
for(i=0; i
min=i;
// 找出"a[i+1] ... a[n]"之間的最小元素,并賦值給min。
for(j=i+1; j
if(a[j] < a[min])
min=j;
}
// 若min!=i,則交換 a[i] 和 a[min]。
// 交換之后,保證了a[0] ... a[i] 之間的元素是有序的。
if(min != i) {
int tmp = a[i];
a[i] = a[min];
a[min] = tmp;
}
}
}
public static void main(String[] args){
int i;
int[] a = {20,40,30,10,60,50};
System.out.printf("before sort:");
for (i=0; i
System.out.printf("%d ", a[i]);
System.out.printf("n");
selectSort(a, a.length);
System.out.printf("after ?sort:");
for (i=0; i
System.out.printf("%d ", a[i]);
System.out.printf("n");
}
}
上面3種實(shí)現(xiàn)的原理和輸出結(jié)果都是一樣的。下面是它們的輸出結(jié)果:
before sort:20 40 30 10 60 50
after ?sort:10 20 30 40 50 60
排序系列文章
關(guān)注算法文摘,修煉開發(fā)內(nèi)功
始發(fā)于微信公眾號(hào): 后端技術(shù)精選
總結(jié)
以上是生活随笔為你收集整理的java选择排序解释_选择排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: antisamy java_antisa
- 下一篇: java 子线程退出_java – 在