常见的排序算法

  

,,

void  Bubble_sort (int  arr [], int 兰)   {   int 我;   (i=0; i< len;我+ +)   {   int  j;   (j=0; j

时间复杂度o (n ^ 2),空间复杂度o (1)。

2,快排:

原理:从中间向两边的探索,在序列中选择一个准基数,用来做参考的数,选择左边的第一个数为例,将序列中所有大于准基数的数放在它的右边,小于的放在它的左边,最终确定准基数的位置。

定义两个变量左,右,可以将其看作指针,指定其对应的某元素,一个指向最左边,一个指向最右边,选择离开作为准基数,从最左边的数和它比较,当准基数小于右指向的数时,正确的———如果大于右指向的数,arr(左)=arr(右),当准基数大于左边的值时,左+ +,如果小于左边的值,arr[右]=arr(左),最后将准基数放在其正确的位置,然后重复上述步骤递归。

源码:

void  Quick_sort (int  arr [], int 前面,int 回来)   {   int 左=前线;   int 右=;   if  (left  & lt;,右)   {   int  tmp =, arr(左);   而(left<右)   {   while  (left  & lt;, right ,,, tmp  & lt;, arr[右])   {   正确的,;   }   arr(左),=,arr[右];   while  (left  & lt;, right ,,, tmp 祝辞,arr(左))   {   左+ +;   }   arr(右),=,arr(左);   }   arr(左),=,tmp;   Quick_sort (arr面前,左一);   Quick_sort(加勒比海盗,左+ 1,);   }   }

时间复杂度o (nlog2n),空间复杂度o (nlog2n)

3,插入排序:

原理:插入排序就是讲一个数字插入到它本该占据的位置。

void  Insertsort (int  arr [], int 兰)   {   int 小姐:=,0;   for (小姐:=,0;,小姐:& lt;, len-1;,我+ +)   {   arr int  tmp =, (i + 1);   int  pos =,我;   while  (pos>=0,,,, arr (pos),祝辞,tmp)   {   arr [pos + 1],=, arr (pos);   pos——;   }   arr [pos + 1],=, tmp;   }   }

时间复杂度o (n ^ 2),空间复杂度o (1)。

4,希尔排序

原理:希尔排序就是基于插入排序的一种改进,先将整个待排元素分成若干个子序列(有相隔某个增量元素组成),分别进行插入排序,然后缩减增量再进行排序,待这整个元素基本有序时(增量足够小),再对全体元素进行一次插入排序。

源码:

void  ShellSort (int  arr [], int 兰)   {   int  gap =, len;   while (差距)   {/2=gap 差距;   for  (int 小姐:=,差距;,小姐:& lt;, len;,我+ +)   {   arr int  tmp =,(我);   int  pos =, i-gap;   while  (pos>=0,,,, arr (pos),祝辞,tmp)   {   arr (pos +差距),=,arr (pos);   pos -=差距;   }   arr (pos +差距),=,tmp;   }   }   }

时间复杂度o (n ^ 2),空间复杂度o (1)。

5,选择排序

原理:在待排序列中将第一个元素记为最小的,第一个位置记为最小位置,在剩余所有元素中找到最小的与之交换。

源码:

void  SelectSort (int  arr [], int 兰)   {   for  (int 小姐:=,0;,小姐:& lt;, len;,我+ +)   {   arr int  min =,(我);   int  index =,我;   for  (int  j =, + 1,, j  & lt;, len;, j + +)   {   如果(arr [j], & lt;, min)   {   min =, arr [j];   j=index ;   }   }   arr arr(指数),=,(我);   arr[我],=,最小值;   }   }

时间复杂度o (n ^ 2),空间复杂度o (1)。

6,堆排

将初始化序列构成大堆,此堆为初始的无序区,将堆顶元素与最后一个元素交换位置,得到一个无序区和一个有序区,交换后的堆顶元素不变,因此将堆顶元素向下调整,保证最大堆的性质。

源码:

void  HeapDown (int  arr [], int 我,int 兰)   {   int 父母=我;   int 孩子=2 * i + 1;   while  (child  & lt;, len)   {   如果孩子+ 1 & lt; len ,,, arr(孩子)& lt; arr[孩子+ 1])   {   孩子=+ 1;   }   如果(arr(孩子)在arr(父))   {   交换(arr(父),arr[孩子]);   时间=parent 儿童;   *=child  parent  2, +, 1;   }   其他的   {   打破;   }   }   }   void  CreateHeap (int  arr [], int 兰)   {   int  i=0;   (我=len/2 - 1, i>=0;我——)   {   HeapDown(加勒比海盗,我,len);   }   }      void 堆排序(int  arr [], int 兰)   {   CreateHeap (len arr);   for  (int 小姐:=,len-1;,小姐:祝辞=,0;,我——)   {   交换(arr [0], arr[我]);   HeapDown (arr 0我);   }   }

常见的排序算法