——个人笔记
桶排序(计数排序):适用于范围小而且重复的数字多,其过程就是,重新开一个数组(桶,通常用数组下表来标志桶的有序),来对无序的数组来进行计数(不同的装在不同的桶里),然后再按照桶里的顺序排就行了。
void BarrelSort(int arr[],int n,int k)//n为数组长度,k为桶的大小(0到k)
{
int *barrel = (int *)malloc(sizeof(int)*k);
for (int i = 0; i < k; i++)
barrel[i] = 0;
for (int i = 0; i < n; i++)
{
barrel[arr[i]]++;
}
int pos = 0;
for (int i = 0; i < k; i++)
{
for (int j = 1; j <= barrel[i]; j++)
{
arr[pos++] = i;
}
}
free(barrel);
}
冒泡排序:常用,效率一般,对于某一步就排好序,他还会继续检测(针对这个冒泡加了个flag来标记改进),其过程就是从左到右两两比较大的向后移动,那么一轮之后最大的就会到最后了(这个移动到最后就有序了,最后是指没有排序的最后,每次会排好一个),进行len-1次之后就会有序了。
void BullerSort(int arr[], int len)
{
for (int i = 0; i < len-1; i++)
{
int flag=1;
for (int j = 0; j < len - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag=0;
}
}
if(flag ==1) return;
}
}
选择排序:常用,效率一般,交换次数比冒泡少,其过程也是从左(没序)到右找,但是只找出最小的数,然后再把最前面的数与最小的数交换,进行len-1次就能排好了。
void SelectSort(int arr[],int len)
{
for (int i = 0; i < len - 1; i++)
{
int min = i;
for (int j = i + 1; j < len; j++)
{
if (arr[min] > arr[j])
min = j;
}
int temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
}
插入排序:有点类似选择和冒泡的结合,边比较边移动,不同的是操作的地方是有序的地方,其过程是从左到右按顺序操作,比较操作数右边的数,比自己大的就向后移动,直到比自己小为止。当操作到最后一个数完成后就会排序好。
void InsertSort(int arr[], int len)
{
for (int i = 1; i < len; i++)
{
int temp=arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > temp)
{
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = temp;
}
}
快速排序:效率高,但是难度大。其过程,以第一个为基数,然后有两个标兵i,j,分别从左到右,从右到左检测(两个相交就停止)。先右边的j检测,向前移动找到小于基数的数才停止(如果本来指的就是就不用动),然后把这个数赋值到i所指的位置,i向右移动找到大于基数的数才停止,然后赋值到j所指的地方,一直重复,直到i,j相遇停止,然后把基数赋值到相遇的地方,这是一轮,会发现,基数左边小右边大,那么递归剩下就可以完成了。
void QuickSort(int arr[],int left,int right)
{
if (left > right)
return;
int i = left, j = right, temp = arr[left];
while (i < j)
{
while (temp < arr[j] && i < j)
j--;
if (i < j)
arr[i++] = arr[j];
while (temp > arr[i] && i < j)
i++;
if (i < j)
arr[j--] = arr[i];
}
arr[i] = temp;
QuickSort(arr, left, i - 1);
QuickSort(arr, i + 1, right);
}