=============================== 博客点滴积累,部分话语和知识点来源于网络,感谢网络资源的提供者======
1 冒泡排序
原理简述:冒泡排序,大泡泡在底下,小泡泡在上面,假设递增排序,即小数在前面,大数在后面。每一次比较相邻的两个数,第一个数大于第二个数,就交换顺序,一次比较到数组结尾,最后一个就是最大的数,再一次从头开始比较,比较到倒数第二个数,最后一个数不参与比较,以此一直比较,到没有数据交换为止,此时排序完成。
void bubblesort(int arr[],int len)
{
int i,j;
int tmp;
for(i = 0; i < len; i ++)
{
for(j = 1; j < len -i; j++)
{
if(arr[j-1] > arr[j])
{
tmp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = tmp;
}
}
}
}
2 插入排序
原理简述:插入排序,插入,即向有序的序列先比较再插入,首先假设数组首元素有序,取出第二个元素,与第一个比较,比第一个元素大,就交换顺序,接着取第三个元素,先与第二个元素,比第二个大,位置不动,比第二个小,第二个元素换到第三个元素的位置,再和第一个比较,比第第一个大,就放到第二个元素位置,比第一个元素小,就将一个元素,放到第二个元素的位置,以此类推。
void insertsort(int arr[],int len)
{
int i,k;
int tmp;
for(i = 1;i < len;i++)
{
tmp = arr[i];
k = i-1;
while((k >=0) && (arr[k] > tmp))
{
arr[k+1] = arr[k];
k--;
}
arr[k+1] = tmp;
}
}
3 选择排序
原理简述:选择排序,即在无序的数组中找个最小的放在第一位,接下来,在剩余的数中,再找一个最小的数,放到第二位,以此类推。
void selectsort(int arr[],int len)
{
int min;
int i,j;
int tmp;
for(i = 0;i < len;i++)
{
min = arr[i];
for(j = i+1; j < len;j++)
{
if(min > arr[j])
{
tmp = min;
min = arr[j];
arr[j] = tmp;
}
}
arr[i] = min;
}
}
4 希尔排序
原理简述:希尔排序,实质是分组插入排序,一般情况,假设数据8个元素,先分为(step = n/2)四组,(1,5),(2,6),(3,7),(4,8),组内先比较 ,比较交换后,再分为(step =step /2)两组,(1,3,5,7),(2,4,6,8),组内先比较排序交换,再分为(step =step /2)一组,排序后,就完成排序了,此时step =step/2 = 0。
void shellsort(int arr[],int len)
{
int step;
int i,k;
int tmp;
for(step = len/2; step > 0; step = step/2)
{
for(i = step; i < len;i++)
{
if(arr[i - step] > arr[i])
{
k = i -step;
tmp = arr[i];
while(k>=0 && arr[k] > tmp)
{
arr[k+step] = arr[k];
k = k -step;
}
arr[k+step] = tmp;
}
}
}
}
5 快速排序
原理简述:快速排序,先选择一个元素(一般首元素或尾元素),假设是首元素,首先取出首元素缓存,首元素位置为空,定义两个变量low,high,low从最小下标递增,high最大下标递减,第一步,看high下标的这个元素,是否大于首元素缓存,大于则high–,继续判断直到不大于则将这个元素放到首元素的位置,此时,high下标的位置为空,比较low下标元素,小于缓存则low++,,继续判断直到不小于则将这个元素放到high下标元素的位置,此时,low下标的位置为空,以此循环,直到low不小于high为止,此时low位置放首元素的缓存,low位置最终就是这个元素排序的位置,然后以low位置为分界线分为两组,再做如上步骤。
void quicksort(int arr[],int left ,int right)
{
int low,high;
int key;
key = arr[left];
low = left;
high = right;
if(left < right)
{
while(low < high)
{
while((low < high) && (key <= arr[high]))
{
high--;
}
arr[low] =arr[high];
while((low < high) && (key > arr[low]))
{
low++;
}
arr[high] = arr[low];
}
arr[low] = key;
quicksort(arr,left,low-1);
quicksort(arr,low+1,right );
}
}
6 归并排序
原理简述:归并排序,先递归后合并,一组数分为两组,两组分为四组,四组分为八组,直到每组只有一个元素,此时认为有序,然后逆向合并,两个一个元素合并两个,两个合并四个,直到合并为一个大数组为止。以下代码来自百度百科。
void Merge(int sourceArr[],int tempArr[],int startIndex,int midIndex,int endIndex)
{
int i = startIndex,j=midIndex+1,k = startIndex;
while(i!=midIndex+1 && j!=endIndex+1)
{
if(sourceArr[i]>sourceArr[j])
tempArr[k++] = sourceArr[i++];
else
tempArr[k++] = sourceArr[j++];
}
while(i!=midIndex+1)
tempArr[k++] = sourceArr[i++];
while(j!=endIndex+1)
tempArr[k++] = sourceArr[j++];
for(i=startIndex;i<=endIndex;i++)
sourceArr[i] = tempArr[i];
}
void MergeSort(int sourceArr[],int tempArr[],int startIndex,int endIndex)
{
int midIndex;
if(startIndex<endIndex)
{
midIndex=(startIndex+endIndex)/2;
MergeSort(sourceArr,tempArr,startIndex,midIndex);
MergeSort(sourceArr,tempArr,midIndex+1,endIndex);
Merge(sourceArr,tempArr,startIndex,midIndex,endIndex);
}
}
堆排序比较麻烦一点,需要理解的知识点较多,下次博客再详细写吧。