排序方法千千万,但冒泡、选择和插入是在大学期间最常见的三种经典排序,自己也在学习的过程中有一些心得,希望能给寻求帮助的朋友带来些许帮助。
一、冒泡排序
核心思想:一次冒泡就将一个数排到最后,例如如果将一组数组按从小到大的顺序排序,第一次冒泡会把最大的数放到最后,第二次会将剩余的数中最大的数排在剩余数组的最后一位,依次循环。
若数组中有n位数,那么就需要n-1次冒泡,而在每次的冒泡过程中,实质就是两个相邻的数进行比较交换,交换的次数和当前冒泡有关,具体来说:交换的次数+当前是第几次循环=冒泡总次数。
#include<stdio.h>
void bubblesort(int arr[], int sz)
{
int i, j;
for (i = 0; i < sz - 1; i++)
{
for (j = 0; j < sz-1-i; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int main()
{
int arr[] = { 3,7,4,2,1,6 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubblesort(arr, sz);
for (int i = 0; i < sz; i++)
printf("%d ", arr[i]);
return 0;
}
二、选择排序
核心思想:每趟把数组走一遍,找到当前的最大值,将其和最后一个数字进行交换,如果数组有n个数,那么就需要进行n-1次交换。
需要解决的问题:1、如何找到当前的最大值 2、找到最大值后,如何确定它在数组中的位置
#include<stdio.h>
int findmax(int arr[], int n)
{
int i; int max = arr[0]; int pos = 0;
for (i = 0; i < n ; i++)
{
if (arr[i] > max)
{
max = arr[i];
pos = i;
}
}
return pos;
}
void selectionsort(int arr[],int n)
{
int pos;
while(n>1)
{
pos = findmax(arr, n);
int temp = arr[pos];
arr[pos] = arr[n - 1];
arr[n - 1] = temp;
n--;
}
}
int main()
{
int arr[] = { 3,7,4,2,6,1 };
int i;
selectionsort(arr, 6);
for (i = 0; i < 6 ; i++)
printf("%d ", arr[i]);
return 0;
}
三、插入排序
核心思想:将数组分为两部分,一部分是排好序的,还有一部分是尚未排序的,将未排好序的依次插入到有序数组的合适位置,最开始排好序的数组一般是第一个数。
#include<stdio.h>
void insert(int arr[], int n) //n表示第n个数字插到前面中去
{
int key = arr[n]; int i = n;
while(arr[i - 1] > key)
{
arr[i] = arr[i - 1];
i--;
if (i == 0)
{
break;
}
}
arr[i] = key;
}
void insertionsort(int arr[], int n)
{
int i;
for (i = 1; i < n; i++)
{
insert(arr, i);
}
}
int main()
{
int arr[] = { 3,7,4,2,6,1 }; int i;
insertionsort(arr, 6);
for (i = 0; i < 6 ; i++)
printf("%d ", arr[i]);
return 0;
}