常用排序算法
一、冒泡算法
1.1 基本思想:
相邻两两比较
,较大的下沉,较小的上升,第一轮之后最小的数就被放到了第一个位置,以此类推。
1.2 优化:
若某一次完了之后已经排好序,则没必要进行到len-1次,可用一个flag,没有交换之后就没必要再进行下去了 。
1.3 测试代码
#include <stdio.h>
#include <stdlib.h>
void bubbleSort(int a[],int length)
{
int len = length;
int temp;//中间变量
bool flag;//优化标志,判断是否有交换
for(int i=0;i<len;i++)
{
flag = false;
for(int j=len-1; j>i; j--)
{
if(a[j]<a[j-1])
{
temp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
flag=true;
}
}
if(!flag)break;
}
}
int main(void)
{
int A[] = {6,5,3,1,8,7,2,4,9};
int lengthA=9;
printf("原始数组:\n");
for(int i=0;i<lengthA;i++)
{
printf("%d",A[i]);
}
printf("\n\n");
bubbleSort(A,lengthA); //冒泡排序
//selectionSort(A,lengthA); //选择排序
//insertSort(A,lengthA); //插入排序
//shellSort(A,lengthA); //希尔排序
//mergeSort1(A,0,lengthA-1,(int*)malloc(sizeof(int)*lengthA)); //归并排序(递归)
//mergeSort2(A,lengthA); //归并排序(非递归)
//heapSort(A,lengthA); //堆排序
//quickSort1(A,0,lengthA-1); //快排序方法一
//quickSort2(A,lengthA); //快排方法二
printf("排序结果:\n");
for(int i=0;i<lengthA;i++)
{
printf("%d",A[i]);
}
printf("\n\n");
return 0;
}
二、选择排序
2.1 基本思想:
一开始就从原始序列中找到最小
的元素,放到序列的起始位置作为已排序序列,然后在剩下的未排序的元素中继续寻找最小的元素,放到已排序的序列末尾
,以此类推,直到所有的元素排列完毕。
2.2 测试代码(main函数参考冒泡排序的测试代码)
void selectionSort(int a[],int length)
{
int len = length;
int minIndex;
int temp;
for(int i=0;i<len;i++)
{
minIndex=i;
for(int j=i+1; j<len; j++)
{
if(a[j]<a[minIndex])
{
minIndex = j;
}
}
if(minIndex != i)
{
temp = a[i];
a[i] = a[minIndex];
a[minIndex] = temp;
}
}
}
三、插入排序
3.1 基本思想:
在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。 插入排序在实现上,常采用in-place排序,因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位