1.插入排序(Insertion Sort 直接插入排序)
思路:
将待排序无序数列看成一个仅含有一个元素的有序数列和一个无序数列,将无需数列中的元素依次插入到有序数列的对应位置。
算法实现:
//直接插入法一,插入位置及位置之后的元素后移
void InsertSortMove(int a[], int n)
{
int i, j,temp;
for(i=1; i<n; i++){
if(a[i] < a[i-1]){ //判断是否是需要插入到有序数列的元素
temp = a[i]; //将要插入的元素保存
for(j=i-1; j>=0; j--){
if(a[j]>temp){
a[j+1] = a[j]; //将他前面的元素后移
}
else
break;
}
a[j+1] = temp; //找到插入的位置,其他元素已经后移保存直接插入即可
}
}
}
//直接插入法二:用数据交换代替法一的元素后移
void InsertSortSwap(int a[], int n)
{
int temp;
for(int i=1; i<n; i++){
for(int j=i-1; j>=0; j--){
if(a[j]>a[j+1]){ //判断前后该元素和其前一个元素是否有序,无序则进行交换
temp=a[j]; //直到该元素与其前面的元素全部有序
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
动态模拟:(位移插入)
代码测试:
1.位移插入:
2.交换插入:
2.冒泡排序(Bubble Sort)
思路:
在一组需要排序的数中,对未有序的相邻两个数依次进行比较和位置调整,满足条件的上浮。每完成一轮排序都会让一个满足条件的元素加入的有序数列。
算法实现:
void BubbleSort(int a[],int n){
int temp;
for (int i = 0; i < n-1; i++){
for (int j = 0; j < n - i - 1; j++){
if (a[j] > a[j + 1]){ //此处逻辑和直接插入的数据交换相似
temp = a[j + 1]; //不同在于冒泡从前往后进行,将有序元素往后放置
a[j + 1] = a[j];
a[j] = temp;
}
}
}
}
动态模拟:
代码测试:
3.选择排序(Select Sort)
思路:
在无序数列中选择满足条件的元素和序列中的第一个元素交换位置,再从其余无序数列元素中寻找满足条件的元素插入有序数列,重复操作,直至所有元素有序。
算法实现:
void SelSort(int a[],int n) {
int temp,min;
for (int i = 0; i < n - 1; i++) {
min = i;
for (int j = i + 1; j < n ; j++) { //在无序数列中选择一个满足条件的数存储下标
if (a[j] < a[min]) { //最后将其放置到有序数列末尾
min = j;
}
}
if (min != i) {
temp = a[i];
a[i]=a[min];
a[min] = temp;
}
}
}
动态模拟:
代码测试:
附:测试代码
#include<stdio.h>
void print(int a[],int n){
for(int i=0;i<n;i++)
printf("%3d",a[i]);
printf("\n");
}
void printRes(int a[],int n,int i){
printf("第%2d次循环完毕:",i+1);
for(int i=0;i<n;i++)
printf("%3d",a[i]);
printf("\n");
}
void InsertSortMove(int a[], int n)
{
int i, j,temp;
for(i=1; i<n; i++){
if(a[i] < a[i-1]){
temp = a[i];
for(j=i-1; j>=0; j--){
if(a[j]>temp){
a[j+1] = a[j];
}
else
break;
}
a[j+1] = temp;
}
printRes(a,n,i);
}
}
void InsertSortSwap(int a[], int n)
{
int temp;
for(int i=1; i<n; i++){
for(int j=i-1; j>=0; j--){
if(a[j]>a[j+1]){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
printRes(a,n,i);
}
}
void BubbleSort(int a[],int n){
int temp;
for (int i = 0; i < n-1; i++){
for (int j = 0; j < n - i - 1; j++){
if (a[j] > a[j + 1]){
temp = a[j + 1];
a[j + 1] = a[j];
a[j] = temp;
}
}
printRes(a,n,i);
}
}
void SelSort(int a[],int n) {
int temp,min;
for (int i = 0; i < n - 1; i++) {
min = i;
for (int j = i + 1; j < n ; j++) {
if (a[j] < a[min]) {
min = j;
}
}
if (min != i) {
temp = a[i];
a[i]=a[min];
a[min] = temp;
}
printRes(a,n,i);
}
}
int main(){
int a[15]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
printf("排序前:");
print(a,15);
SelSort(a,15);
}
(动图源于网络)