排序--简单排序


一、冒泡排序

原理:从第一个元素开始遍历比较,如果相邻元素大于它,就做一次交换,冒泡完成的元素不参与下一次比较,由此可见越往后的元素需要比较的次数递减,for循环可实现。

源代码:

void bubble_sort(int *array, int size_array) {     for(int j = size_array ; j >= 0; j--)     {         int flag = 0;         for(int i = 0; i< j; i++)         {             if(array[i] > array[i + 1])             {                 swap(&array[i],&array[i+1]);                 flag = 1;             }         }         if(flag == 0) break;     } }   二、插入排序 原理:从第二个元素开始向前比较判断,如果比前一个元素小,则前一个元素往后移动一位,直到第一个元素或者前面条件不成立,将该元素插入当前位置。 源代码: void insertion_sort(int *array, int size_array) {     for(int j = 1 ;j <=size_array; j++)     {         int i = j;         int temp = array[j];         for(; i > 0 && temp < array[i - 1]; i--)             array[i] = array[i - 1];         array[i] = temp;     } }   三、选择排序 原理:可以简单理解为冒泡的逆过程,从第一个元素开始,找出所有元素的最小值,将最小值和第一个元素交换,依次类推,从第二个第三个做同样的操作,最后得到一个有序序列 源代码: void selection_sort(int *array, int size_array) {     for(int i = 0; i < size_array; i++)     {         int min_position = i;         for(int j = i; j< size_array; j++)         {             if(array[min_position] > array[j])             min_position = j;
        }         swap(&array[i],&array[min_position]);     } }       四、希尔排序 原理:可以看作是插入排序的升级,前两种排序最坏时间复杂度都是O(N^2),希尔排序不采用相邻两个元素之间进行比较插入,而是选择有一定间隔的元素之间进行比较插入,原因是为了能一次消除多个逆序对,减少时间复杂度,间隔的大小按规则减小,直到间隔为1进行一次插入排序,得到有序的元素序列。 关键:选取增量序列 源代码: void shell_sort(int *array, int size_array) {     int N = (size_array + 1)/2;     for(int k = N; k > 0; k /= 2)     {         for(int j = k ;j <=size_array; j++)         {             int i = j;             int temp = array[j];             for(; i > k - 1 && temp < array[i - k]; i -= k)                 array[i] = array[i - k];             array[i] = temp;         }     } }