冒泡排序:
思路:将相邻的两个数比较,将较小的数调到前头;有n个数就要进行n-1趟比较,第一次比较中要进行n-1次两两比较,在第j趟比较中,要进行n-j次两两比较。
依次比较相邻的两个数,将小数放在前面,大数放在后面。即首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复以上过程,直至最终完成排序。
两种方式写:
第一种就是每次遍历从前往后,第二种是每次从后往前
从前往后的话就是,每次确定的是最后一个最大的数
从后往前的话就是,每次确定的是最前边的最小的数
void bubble_sort(int a[], int n)
{
int i, j, temp;
for (j = 0; j < n - 1; j++)
for (i = 0; i < n - 1 - j; i++)
{
if(a[i] > a[i + 1])
{
temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
}
}
}
void BubbleSort(int[] array)
{
int length = array.Length;
for (int i = 0; i <= length - 1; i++)
{
for (int j = length - 1; j > i; j--)
{
if (array[j] < array[j - 1] )
{
int temp = array[j];
array[j] = array[j - 1];
array[j - 1] = temp;
}
}
}
}
选择排序:选择一个值array[0]作为标杆,然后循环找到除这个值外最小的值(查找小于标杆的最小值),交换这两个值,这时最小值就被放到了array[0]上,然后再将array[1]作为标杆,从剩下未排序的值中找到最小值,并交换这两个值。
如图:(数据结构与算法中的图)
2、时间复杂度:O(N^2),不稳定算法,与冒泡排序相比减少了数组交换的次数
void choicesort(int * a,int n){
for(int i=0;i<n-1;i++){
int min=a[i];
int key=0;
for(int j=i+1;j<n;j++){
if(min>a[j]){
min=a[j];
key=j;
}
}
//交换
a[key]=a[i];
a[i]=min;
}
}
直接插入排序
插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。
插入排序的工作方式像玩扑克牌时顺序放牌一样。开始时,左手为空并且桌子上的牌面向下。然后,每次从桌上拿一张牌并将它插入左手中正确的位置。为了找到正确的位置,我们从右到左将它与已在手中的每张牌比较,原来的牌是排好序的,如果比刚拿出的牌大,则将其再向右移一个位置,直到找到一个比刚拿出来的牌更小的,此时将这张牌放到该位置。
算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法,即两个相等的元素在排序后能保持原来的顺序。
void insertsort(int *a,int n ){
for(int j=1;j<n;j++){
int key=a[j];
int i=j-1;
while(i>0&&a[i]>key){
a[i+1]=a[i];
i--;
}
a[i+1]=key;
}
}