插入排序:
将一组数据分成两组,将其称为有序组与待插入组。每次从待插入组中取出一个元素,与有序组的元素进行比较,并找到合适的位置,将该元素插到有序组当中。就这样,每次插入一个元素,有序组增加,待插入组减少。直到待插入组元素个数为0。
为了排序方便,我们一般将数据第一个元素视为有序组,其他均为待插入组。
升序图解:
- void InsertionSort(int *num,int n)
- {
- int i = 0;
- int j = 0;
- int tmp = 0;
- for(i = 1;i<n;i++)
- {
- tmp = num[i];//从待插入组取出第一个元素。
- j = i-1; //i-1即为有序组最后一个元素(与待插入元素相邻)的下标
- while(j>=0&&tmp<num[j]) //注意判断条件为两个,j>=0对其进行边界限制。第二个为插入判断条件
- {
- num[j+1] = num[j];//若不是合适位置,有序组元素向后移动
- j--;
- }
- num[j+1] = tmp;//找到合适位置,将元素插入。
- }
- }
*******************************************************************************************************
快速排序:
6 1 2 7 9 3 4 5 10 8
以6为基准数
首先设置两个哨兵i 和 j
i指向第一个元素 ,j指向最后一个元素
每次走的时候j先走
j向左移动寻找比基准数小的数字,找到了停下来
i向右移动寻杂比基准数大的数字,找到了停下来
他们互相进行交换
然后j继续向左移动,直到找到比基准数小的数
i同样也是向右移动,知道找到比基准数大的数
如果他们碰面的话,就将他们碰面时指向的数字和基准数进行交换,此时就完成了第一次的基准数归位。
继续以第一个元素为基准数,继续进行以上的操作,知道所有的基准数归位。
//快速排序
void quicksort(int a[],int left,int right)
{
//left 代表是整个数组的第一个以他为基数
//right 代表是数组的最后一个
int i,j,t,temp;
if(left > right)
return ;
temp = a[left];//基准数
i = left;
j = right;
while(i != j)
{
//先从右边开始找
while(a[j] >= temp && i < j)
j--;
//从右边开始找
while(a[i] <= temp && i < j)
i++;
//交换两个数在数组中的位置
if(i < j)
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
//基准数归位
a[left] = a[i];
a[i] = temp;
quicksort(a,left,i-1);//继续处理左边的-----递归
quicksort(a,i+1,right);//继续处理右边的----递归
}