这些基本算法,以前虽然也有了解过,但是到现在才真正的理解了。
1.冒泡排序
冒泡排序就是直接依次往后比较,每比较一次就把最大的移动到最后面。
<pre name="code" class="cpp">void Bubble_sort(int a[],int size)
{
int i;
int j;
int tmp;
int flags;
for(i = 0; i < size; i++)
{
flags = 0;
for(j = 0; j < size-i-1; j++)<span style="white-space:pre"> </span>//依次比较
{
if(a[j] > a[j+1])<span style="white-space:pre"> </span>//前面一个比后面一个大,则交换
{
flags = 1;
tmp = a[j+1];
a[j+1] = a[j];
a[j] = tmp;
}
}
if(!flags)
{
break;
}
}
}
2.快速排序
/*快速排序*/
void Quik_sort(int arr[],int low,int high)
{
int i = low;
int j = high;
int key = arr[low]; //关键字
int mid;
while(low < high)
{
/*1.对关键字的右边进行比较*/
while(low < high)
{
if(arr[high] < key)
{
break;
}
high--;
}
if(low < high)
{
arr[low] = arr[high];
low++;
}
/*2.对关键字的左边进行比较*/
while(low < high)
{
if(arr[low] > key)
{
break;
}
low++;
}
if(low < high)
{
arr[high] = arr[low];
high--;
}
}
if(low == high)
{
mid = low;
arr[low] = key;
}
if(i < j)
{
/*对关键字前半部分进行递归调用*/
Quik_sort(arr,i,mid-1);
/*对关键字后半部分进行递归调用*/
Quik_sort(arr,mid+1,j);
}
}
/*直接插入排序:速度一般
* 优点:稳定
* **************************/
void Delect_sort(int arr[],int size)
{
int i; //指向未排序部分
int j; //指向排好序部分
int key; //关键字
int k;
/*控制未排序部分*/
for(i = 1; i < size; i++)
{
key = arr[i]; //依次取出关键字
/*对排好序的部分进行比较*/
for(j = 0; j < i; j++)
{
if(key < arr[j])
{
break;
}
}
if(i != j)
{
memmove((void *)&arr[j+1],(void *)&arr[j],(i-j)*sizeof(arr[0]));
}
arr[j] = key;
}
}
4.希尔排序
/*希尔排序*/
void Shell_sort(int a[],int size)
{
int d; //增量
int i;
int j;
int key;
/*循环获取增量d*/
for(d = size/2; d > 0; d = d/2)
{
for(i = d; i < size; i++)
{
key = a[i]; //依次获取关键字
/*对每组进行直接插入排序*/
for(j = i-d; (j >= 0) && (a[j] > key); j = j-d)
{
a[j+d] = a[j];
}
a[j+d] = key;
}
}
}
5.选择排序
/*选择排序*/
void Select_sort(int arr[],int size)
{
int min;
int i;
int j;
int tmp;
for(i = 0; i < size; i++)
{
min = i; //最小值的下标
for(j = i+1; j < size; j++)
{
if(arr[min] > arr[j])
{
min = j;
}
}
if(min != i)
{
tmp = arr[min];
arr[min] = arr[i];
arr[i] = tmp;
}
}
}