用C实现插入排序和快速排序
- 插入排序
插入这词太具有欺骗性,并不是说在已经生成的数组中又插进来一个什么新的数,而是从数组元素中选出一个“标杆”元素(按索引遍历),让这个元素和之前的元素进行比较,直到找出一个元素大于这个“标杆”元素进行交换。
这样一来,我们大概可以构建出两层循环-----
- 外循环负责遍历数组,每次选出新的标杆元素,
- 内层while循环,不断在标杆所在的索引位置之前搜寻,找出大于“标杆”的元素,完成和标杆的位置交换,
- 如果找不到,那么标杆元素就“名正言顺的呆在”当前的索引上。
void insertone(int a[]) { int temp,i,j; //事先我定义的就是10个元素的数组 for (int i = 1; i < 10; i++) { temp = a[i];//----1 j = i - 1;//-----2 while (j>-1 && temp<a[j]) { a[j + 1] = a[j]; j--; } a[j + 1] = temp;//----3 } }
- 快速排序
思想大致如下:
选取一个元素作为比较对象----就称之为前哨吧,就拿24来说
- 从后向前遍历,比他小的,扔到他左边
- 从前向后遍历,比他大的,扔到他右边
- 由于表示索引的i和j的值,j不断减少(后退)i不断增加(推进),上述两个条件成立的前提是i<j
- 理想状态下,步骤1,2,穷竭遍历也找不到比前哨大,或者小的了,那么前哨就安稳的呆在当前索引上了
void quicksort(int a[],int start,int end) { int i = start; int j = end; int temp = a[i]; while (i < j)//-----3 { while (i<j && temp<=a[j])//-----1 { j--; } if (i<j)//-----3 { a[i] = a[j]; } while (i<j && temp>=a[i])//-----2 { i++; } if (i<j)//-----3 { a[j] = a[i]; } } a[i] = temp;//-------4 if (start < i) { quicksort(a, start, i - 1); } if (i<end) { quicksort(a, j + 1, end); } }
输出结果:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<time.h> void genarray(int a[],int *b) { time_t t; int mynum; FILE *fp = fopen("E:\\myarray.txt", "w"); srand((unsigned)time(&t)); for (int i=0;i<10;i++) { *b = rand() % 100; fwrite(b,sizeof(int),1,fp); } fclose(fp); } void readarray(int a[],int *b) { FILE *fp = fopen("E:\\myarray.txt", "rb"); for (int i = 0; i < 10; i++) { fread(b, sizeof(int), 1, fp); //printf("%d\t", mynum); a[i] = *b; } fclose(fp); } void main() { int a[10],mynum; genarray(a,&mynum); readarray(a, &mynum); for (int i = 0; i < 10; i++) { printf("%d\t", a[i]); } printf("\n"); //insertone(a, 27);
quicksort(a,0,9); for (int i=0;i<10;i++) { printf("%d\t",a[i]); } system("pause"); }