除了冒泡排序和选择排序以外,还有插入排序、快速排序(检查快排)
插入排序:顾名思义,是一种插入的操作,即假定前边已经有序,拿到有序后边的数字一次和前面的数做比较,直到插入到前边的数比他大为止。这样将是不是很抽象呢?好吧我们先看代码, count是a数组的总数:
void insertSort(int a[], int count) {
for (int i = 1; i < count - 2; i++) {
int needInsertNumber = a[i];
int j = i;
while (a[i] < a[j-1] && j > 0) {
a[j] = a[j-1];
j--;
}
a[j] = needInsertNumber;
}
printf("\n插入排序结果:");
for (int i = 0; i < count; i++) {
printf("%d\t", a[i]);
}
}
代码中,可以看到,i代表我们将要插入的数字(即还未被排序的数字),用while循环来控制和前边的数字是否需要插入到此处,ok,我们分析下这段代码,首先拿出了第二个数字53,然后比较53和53之前的数字,53之前的数字3小于53所以不进入while循环,此时数组没有变化,i++,此时i = 2,拿出23,23和53做比较,发现53>23,进入循环此时数组里23和53做了交换,然后j--,此时j=1,所有j-1de位置是3,23和3又做了比较,发现3<23,退出while循环,for循环拿出54.。。。看懂了吗?排队中一次拿出下一个,插入到已经排好序的前边,其实也不难理解是不是
总结:插入排序比冒泡要快一倍,很多时候比选择排序也要快一些
希尔排序:应该说希尔排序也属于插入排序,希尔排序增加了比较的跨度,所以希尔排序比直接插入排序会效率高一点,但是希尔排序的效率还是不如快速排序,如果数据量小的话,基本都还ok,如果数据量上来建议大家选择快速排序。
基本原理:不再比较挨着的数字,而是做间隔比较。间隔越来越小,直到间隔为1的时候,排序停止,不多说了直接代码:
快速排序:快排应该是效率最高的,最好的一种排序方法,对冒泡算法进行了改进。
基本原理:以一个数为基准数据,将数据分为两组:左边比基准数据小,右边比基准数据大。然后采用递归方式再将这两组数据按相同的方式去排序,知道最后排好顺序为止。
代码如下:
void xierSort (int a[], int count) {
int d = count/2;
int forCount = 0;//循环次数
int changeCount = 0;//交换次数
while (d > 0) {
for (int i = 0; i < d; i++) {
for (int j = i; j + d < count; j+=d) {
forCount++;
if (a[j] > a[j + d]) {
changeCount++;
int tmp = a[j];
a[j] = a[j+d];
a[j+d] = tmp;
}
}
}
d --;
}
printf("\n希尔排序\t循环次数:%d\t交换次数%d\n结果:", forCount, changeCount);
for (int i = 0; i < count; i++) {
printf("%d\t", a[i]);
}
}
quickSort(a, 0, count-1);
void quickSort (int a[], int left, int right) {
if (left < right) {
int i = left;
int j = right;
int key = a[left];
while (i < j) {
while (a[j] > key) {
j--;
}
a[i] = a[j];
a[j] = key;
while (a[i] < key) {
i++;
}
a[j] = a[i];
a[i] = key;
}
quickSort(a, left, i-1);
quickSort(a, i+1, right);
}
}
有什么问题可以私信我,欢迎大家指点交流