经典比较排序分类
-
经典比较排序
-
-
交换排序
- 冒泡排序
- 快速排序
-
-
插入排序
- 经典插入排序
- shell希尔排序插入排序
-
-
选择排序
- 经典选择排序
- 堆选择排序
- 归并排序
交换排序
冒泡排序
冒泡排序算法是把较小的元素往前调或者把较大的元素往后调。冒泡排序的基本思想是,首先将第1个和第2个记录的关键字比较大小,如果是逆序的,就将这两个记录进行交换,再对第2个和第3个记录的关键字进行比较,依次类推,重复进行上述计算,直至完成第(n一1)个和第n个记录的关键字之间的比较,此后,再按照上述过程进行第2次、第3次排序,直至整个序列有序为止。排序过程中要特别注意的是,当相邻两个元素大小一致时,这一步操作就不需要交换位置,因此也说明冒泡排序是一种严格的稳定排序算法,它不改变序列中相同元素之间的相对位置关系。
C代码实现冒泡排序
int swap(int *a,int *b)
{
int temp = *a;
*a = *b;
*b = temp;
return 0;
}
int my_print(int *data,int length,char * msg_info)
{
int i = 0;
printf("%s排序的结果:\n",msg_info);
if (!data[0] || length <= 0)
{
return -1;
}
for(i=0;i<length;i++)
{
printf("%d ",data[i]);
}
printf("\n");
return 0;
}
/* 冒泡排序 */
int bub_sort(int *data,int length)
{
int flag = 0;
int i=0,j=0;
char buffer[1025] = {
0};
for (i=0; i<length;i++,flag=0)
{
for (j=0; j<length-i; j++)
{
if(data[j]>data[j+1])
{
swap((data+j), (data+j+1));
flag = 1;
}
}
//sprintf(buffer,"第%d次,冒泡的结果",i+1);
//my_print(data,length,buffer);
if (!flag)
{
break;
}
}
}
int main()
{
int j = 0;
int data[DATA_ARRAY_LENGTH] = {
12,32,2,57,83,92,102,8,205,123,11,55,68,26,66,90};
printf("排序函数开始\n");
my_print(data,DATA_ARRAY_LENGTH,"原数据");
bub_sort(data,DATA_ARRAY_LENGTH);
my_print(data,DATA_ARRAY_LENGTH,"冒泡排序bub_sort");
printf("排序函数结束\n");
return 0;
}
快速排序
快速排序的基本思想是:通过一趟排序算法把所需要排序的序列的元素分割成两大块,其中,一部分的元素都要小于或等于另外一部分的序列元素,然后仍根据该种方法对划分后的这两块序列的元素分别再次实行快速排序算法,排序实现的整个过程可以是递归的来进行调用,最终能够实现将所需排序的无序序列元素变为一个有序的序列。
C代码实现快速排序
/* 快速排序 */
int quick_sort(int *data,int length)
{
int last = 0;
int j = 1;
char buffer[1025] = {
0};
if(length <= 1)
{
return 0;
}
for (j=1; j<length; j++)
{
if(data[j]<data[0])
{
last++;
if(last<j)
{
swap((data+last), (data+j));
}
}
}
swap(&data[last], &data[0]);
quick_sort(data,last);
quick_sort((data+last+1),length-last-1);
return 0;
}
int main()
{
int j = 0;
int data[DATA_ARRAY_LENGTH] = {
12,32,2,57,83,92,102,8,205,123,11,55,68,26,66,90};
printf("排序函数开始\n");
my_print(data,DATA_ARRAY_LENGTH,"原数据");
quick_sort(data,DATA_ARRAY_LENGTH);
my_print(data,DATA_ARRAY_LENGTH,"快速排序quick_sort");
printf("排序函数结束\n");
return 0;
}