c++自帶的algorithm庫函式中提供了排序演算法。
自帶排序演算法的一般形式為:
sort(arr+m,arr+n);//將陣列arr的下標為m的元素到下標為n-1的元素進行從小到大排序
sort(arr+m,arr+n,comp);//與sort(arr+m,arr+n)相比,這個寫法可以自己定義排序的規則,其中,comp為自定義的函式
基本思想:
選擇排序(從小到大)的基本思想是,首先,選出最小的數,放在第乙個位置;然後,選出第二小的數,放在第二個位置;以此類推,直到所有的數從小到大排序。
在實現上,我們通常是先確定第i小的數所在的位置,然後,將其與第i個數進行交換。
評價:
注意:選擇排序是一種不穩定的排序演算法,可能會打亂兩個相同數字的原有順序。
例如,序列 5 8 5 2 9, 按照從小到大排序,第一輪會將第1個數字5會和2交換,那麼原序列中2個5的相對前後順序就被破壞了,所以選擇排序是一種不穩定的排序演算法。
#include
#include
#include
const
int maxn = 10;
int main (void)
; int i = 0;
int j = 0;
srand( (unsigned)time(null) );//rand()函式產生的是偽隨機數(產生原理是 f(種子值),也就是關於乙個固定值的固定公式;
//也就是程式執行第一次和第二次產生的隨機數是一樣的,所以我們要利用srand()進行播種;srand(unsigned seed)
for (int k = 0; k < maxn; k++)
printf("初始化陣列:");
for (i = 0; i < maxn; i++)
printf("\n");
/*----------*/
//選擇排序原理:
//1、從第乙個數開始(a[0]),找到陣列中最小的數的位置,然後交換第乙個數和最小數
//2、從第二個數開始(a[1]),找到剩餘數中最小數的位置(對應整個陣列第二小的數),然後交換第二個數和最小數
//......
//n-1、從第n-1個數開始(a[maxn-1]))、最後一次,比較最後兩數了。
//外迴圈:對應找第乙個位置上的最小數,第二個,...,當前n-1個都找好了,最後乙個自然不用找了,
// 故邊界條件為 0 ~ maxn-1 ,共 n-1次;
//內迴圈:要完成的任務是:遍歷陣列元素找到最小值;交換該位置數和最小值所在位置數,如果是本身就不用交換;
// 起點對應第一小的數放在第乙個位置,第乙個數也要遍歷到;
// 但是我是用第乙個數最為參照進行比較的,所以起點i = j + 1,直接與下乙個數進行比較即可,一直到最後乙個數;
//交換數:採用位運算中的異或運算交換兩個不同的數;
// 原理:a^b^b = a;
/*------- -*/
for (j = 0; j < maxn - 1; j++)
}if (j != min_index)
}printf("排序後陣列:");
for (i = 0; i < maxn; i++)
putchar('\n');
return
0;}
#include
#include
#include
const
int size = 10;
void select_sort(int a, int maxn)
printf("\n");
//核心部分
for (int j = 0; j < maxn - 1; j++)
}if (j != min_index)
}printf("排序後陣列:");
for (int i = 0; i < size; i++)
putchar('\n');
}int main (void)
select_sort(a, size);//排序
return
0;}
基本思想
氣泡排序(從小到大)的基本思想是,不斷比較相鄰的兩個數,讓較大的元素不斷的往後移,經過一輪比較,就選出最大的數;經過第二輪比較就選出次大的數,以此類推。
一般實現
#include
#include
#include
#include
const
int size = 10;
void select_sort(int a, int maxn)
printf("\n");
/*--------*/
//基本思想:第一輪,比較a[0]和a[1],如果a[0]>a[1],則交換兩數,接著比較a[1]和a[2],......最後一次為a[n-2]和a[n-1]的比較,至此,a[n-1]為最大數
// 第二輪,比較a[0]和a[1], ......最後一次為a[n-3]和a[n-2]的比較
// .......
// 第n-1輪,比較a[0]和a[1],結束排序
// 外迴圈: 0~szie-1 共 n -1 輪
// 內迴圈: 總是從0和1開始比較的,故初始值j=0開始,比較到size - 1 - i;
//
//兩輪迴圈的迴圈變數的意義不同,乙個是輪數,乙個數陣列元素下表 注意理解二者的區別和聯絡
/*--------*/
for (i = 0; i < size - 1; i++) }}
printf("排序後陣列:");
for (i = 0; i < size; i++)
putchar('\n');
}int main (void)
select_sort(a, size);//排序
return
0;}
優化實現
for (i = 0
; i < size - 1; i++)
}if (issorted)
}
評價
優點:穩定;
缺點:慢,每次只能移動相鄰兩個資料。
快速排序 C語言描述
time limit 15ms memory limit 65536kb submit statistic discuss problem description 山東理工大學有很多學生,當然也有很多美女,機械實驗班的學委 外號 大王八 很想找個女朋友,但他想找個身高和自己相配的女生做女朋友,現有理...
希爾排序 C語言描述
下面用個例子來說明一下 演算法編寫 for j 0 add j 0 j 依次增量排序 p k a temp 可以看出來,希爾排序是將陣列序列分成若干個子串行,然後再將子串行進行插入排序,等到序列基本有序時,最後進行一次全體插入排序。不穩定排序 可以從上面的那個例子看出,有兩個相同的數 48,但在最終...
C語言演算法描述基礎
1.2 選擇排序演算法 1.3 插入排序演算法 1.4 快速排序演算法 2.查詢演算法 定義 演算法是一些常見問題的通用解決方法 排序演算法可以按照某種順序把一組數字排列好 排序演算法每次只把乙個數字放在合適的位置上,通過大量重複以上過過程最終把所有數字都放到合適的位置上 為了把合適的數字放到合適的...