排序是计算机内经常进行的一种操作,其目的是将一组”无序”的记录序列调整为”有序”的记录序列。
分内部排序和外部排序。若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序。反之,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。内部排序的过程是一个逐步扩大记录的有序序列长度的过程。
基础内部排序:
1.直接排序
【介绍】没有任何算法上的技术含量,作为初学C语言时理解for循环语句的练习。
【代码】
void StraightSelect_sort(int *a, int n){
int i, j;
elemtype t;
for(i = 0;i < n;i++){
for(j = 0;j < n;j++){
if(a[i] > a[j]){
t = a[j];
a[j] = a[i];
a[i] = t;
}
}
}
}
2.冒泡排序(交换排序)
【介绍】
设想被排序的数组R[1..N]垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上”漂浮”,如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。
【算法】
冒泡排序算法的运作如下:(从后往前)
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
时间复杂度是O(n^2)
【信息参考】
360百科
https://my.oschina.net/willyliu/blog/167017
【代码】
void Bubble_sort(int *a, int n) {
int i, j;
elemtype t;
for(i = 0; i < n-1; i++) {
for(j = 0; j < n-i-1;j++) {
if(a[j] > a[j+1]) {
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
}
3.选择排序
【介绍】选择排序法的第一层循环从起始元素开始选到倒数第二个元素,主要是在每次进入的第二层循环之前,将外层循环的下标赋值给临时变量,接下来的第二层循环中,如果发现有比这个最小位置处的元素更小的元素,则将那个更小的元素的下标赋给临时变量,最后,在二层循环退出后,如果临时变量改变,则说明,有比当前外层循环位置更小的元素,需要将这两个元素交换.
【算法】
选择排序是这样实现的:
1、设数组内存放了n个待排数字,数组下标从1开始,到n结束。
2、初始化i=1
3、从数组的第i个元素开始到第n个元素,寻找最小的元素。
4、将上一步找到的最小元素和第i位元素交换。
5、i++,直到i=n-1算法结束,否则回到第3步
选择排序的平均时间复杂度也是O(n^2)的。
void Selection_sort (int* a, int n) {
int i, j, k;
elemtype t;
for(i = 0; i < n-1; i++) {
k = i;
for(j = i+1; j < n; j++) {
if(a[k] > a[j])
k = j; //a[j]中存放最小元素值
}
if(k != i) {
t = a[k];
a[k] = a[i];
a[k] = t;
}
}
}
4.快速排序
【介绍】
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
【算法】
它采用了分治的思想:先保证列表的前半部分都小于后半部分,然后分别对前半部分和后半部分排序,这样整个列表就有序了。这是一种先进的思想,也是它高效的原因。因为在排序算法中,算法的高效与否与列表中数字间的比较次数有直接的关系,而”保证列表的前半部分都小于后半部分”就使得前半部分的任何一个数从此以后都不再跟后半部分的数进行比较了,大大减少了数字间不必要的比较。但查找数据得另当别论了。
int QsortInsert(int* a, int low, int high ){
int key = a[low];
while(low < high){
while(low < high && a[high] >= key){
high--;
}
a[low] = a[high];
while(low < high && a[low] <= key){
low++;
}
a[high] = a[low];
}
a[low] = key;
return low;
}
void Quick_sort(int* a, int low, int high){
int p;
if(low < high){//仅当区间长度大于1时才须排序
p = QsortInsert(a, low, high); //对队列进行划分
Quick_sort(a, low, p-1);//分别对左右区间递归排序
Quick_sort(a, p+1, high);
}
}
5.C语言中快快排函数
【语法】
#include <stdlib.h> void qsort( void *buf, size_t num, size_t size, int (*compare)(const void *, const void *) );
int cmp ( const void *a , const void *b )
{
return *(int *)a - *(int *)b; //升序排序
//return *(int *)b - *(int *)a; //降序排序
/*可见:参数列表是两个空指针,现在他要去指向你的数组元素。所以转型为你当前的类型,然后取值。升序排列时,若第一个参数指针指向的“值”大于第二个参数指针指向的“值”,则返回正;若第一个参数指针指向的“值”等于第二个参数指针指向的“值”,则返回零;若第一个参数指针指向的“值”小于第二个参数指针指向的“值”,则返回负。降序排列时,则刚好相反。
*/
int main(int argc,char* argv[])
{
qsort(s,n,sizeof(s[0]),cmp);
return 0;
}
}
【功能】
对buf 指向的数据(包含num 项,每项的大小为size)进行快速排序。如果函数compare 的第一个参数小于第二个参数,返回负值;如果等于返回零值;如果大于返回正值。函数对buf 指向的数据按升序排序。