首先定义顺序表,实现由小到大的排序
typedef int ElemType ;
typedef struct {
ElemType *elem;
int length;
int listsize;
}SqList;//SqList是结构体名字
L.length为数组长度
- 冒泡排序法:将每个元素和他后面剩余元素相比较,需要比较次数很多,因而效率也低~
//第一个数不需要比较,所以为L.length-1
for(int i=0;i<L.length-1;i++){
for(int j=i+1;j<L.length;j++){
if(L.elem[i]>L.elem[j]){
ElemType e;
e=L.elem[i];
L.elem[i]=L.elem[j];
L.elem[j]=e;
}
}
}
- 选择排序法:在冒泡基础上加上了最小元素下标k。将每个元素也他后面的元素相比较,如果L.elem[i]小于L.elem[j],那么就k=i,通过判断每次下标是否为i来选择是否要进行元素换位。
for(int i=0;i<L.length-1;i++){
int k=i;
for(int j=i+1;j<L.length;j++){
if(L.elem[k]>L.elem[j]) k=j;
}
if(i!=k){
int e;
e=L.elem[i];
L.elem[i]=L.elem[k];
L.elem[k]=e;
}
}
- 快速排序法:通俗见解,其实就是一半一半排序,以整体的中点为界分为两个区间a,b,前一区间a的值都大于区间起始点M,后一区间b的值均小于M,重复,直至到达区间中点;再取前一区间起点M1,再将前一区间分为两部分a1,b1,a1前一区间的值均大于M1,a1后一区间的值均小于M1,b1也是如此,重复进行,直至到达区间中点。
void quick_sort( SqList &L, int l, int r)
{
if (l < r)
{
//将中间的这个数和第一个数交换
//x定为第一个元素
int i = l, j = r, x = L.elem[l];
while (i < j){
//这里因为我们是j--,i++,j--,i++。。。。因此,我们的循环可以以j--作为开始
while(i < j && L.elem[j] >= x) // 从右向左找第一个小于x的数
j--;
if(i < j)
L.elem[i++] = L.elem[j];
while(i < j && L.elem[i] < x) // 从左向右找第一个大于等于x的数
i++;
if(i < j)
L.elem[j--] = L.elem[i];
}
//定向到i的位置
L.elem[i] = x;
quick_sort(L, l, i - 1); // 递归调用
quick_sort(L, i + 1, r);
}
}