掌握这几种排序算法也是程序员的基本内功,时间复杂度,控件复杂度,稳定性就不说了,看看代码的具体实现,最想总结就是希尔排序和插入排序有着紧密的联系
快速排序实现还是很有意思的
一:选择排序 冒泡排序
#include <stdlib.h>
#include <stdio.h>
void PrintfArray(int marray[],int length)
{
int i = 0;
for (i = 0; i < length;i++)
{
printf("%d\t", marray[i]);
}
printf("\n");
}
void Swap(int marray[],int i,int j)
{
int tmp;
tmp = marray[i];
marray[i] = marray[j];
marray[j] = tmp;
}
//选择排序
void SelectionSort(int marray[],int length)
{
int i = 0, j = 0;
for (i = 0; i < length - 1;i++)
{
for (j = i + 1;j < length;j++)
{
if (marray[i] > marray[j])
{
Swap(marray, i, j);
}
}
}
}
void main()
{
int array[] = { 12, 5, 433, 253, 216, 7 };
int length = sizeof(array) / sizeof(*array);
PrintfArray(array, length);
SelectionSort(array, length);
PrintfArray(array, length);
printf("邵忠棋");
system("pause");
}
冒泡排序核心算法:
void BubbleSort(int marray[],int length)
{
int i = 0, j = 0;
for (i = 0; i < length - 1;i ++)
{
for (j = 0; j < length-1-i;j++)
{
if (marray[j] > marray[j+1])
{
SwapDemo2(marray, j, j + 1);
}
}
}
}
插入排序核心算法:
void InsertSort(int marray[],int length)
{
int i = 0, j = 0, k = 0;
for (i = 1; i < length;i++)
{
int tmp = marray[i];
k = i;
for (j = i - 1;j >= 0;j--)
{
//后移元素
if (marray[j] > tmp)
{
marray[j + 1] = marray[j];
//记录插入元素的位置
k = j;
}
}
marray[k] = tmp;
}
希尔排序核心算法:
void ShellSort(int marray[],int length)
{
int i = 0, j = 0, k = 0;
int gap = length;
do
{
gap = gap / 3 + 1; //业界标准
for (i = gap;i < length;i++)
{
int tmp = marray[i];
k = i;
for (j = i - gap;j >= 0;j-=gap)
{
if (marray[j] > tmp)
{
marray[j + gap] = marray[j];
k = j;
}
}
marray[k] = tmp;
}
} while (gap > 1);
}
快速排序整体代码:
#include <stdlib.h>
#include <stdio.h>
void PrintfArrayDemo4(int marray[], int length)
{
int i = 0;
for (i = 0; i < length;i++)
{
printf("%d\t", marray[i]);
}
printf("\n");
}
void SwapDemo4(int marray[],int i,int j)
{
int tmp = marray[i];
marray[i] = marray[j];
marray[j] = tmp;
}
//进行一次快速排序
int Partition(int marray[],int low,int high)
{
int pv = marray[low];
while (low < high)
{
while (marray[high]>pv)
{
high--;
}
//high进行交换
SwapDemo4(marray, low, high);
while (marray[low]<pv)
{
low++;
}
SwapDemo4(marray, low, high);
}
return low;
}
void FastSort(int marray[], int low, int high)
{
if (low < high)
{
int position = Partition(marray, low, high);
FastSort(marray, low, position - 1);
FastSort(marray, position + 1, high);
}
}
void mainDemo4()
{
int array[] = { 12, 5, 433, 253,100, 216, 7 };
int length = sizeof(array) / sizeof(*array);
PrintfArrayDemo4(array, length);
FastSort(array, 0,length-1);
PrintfArrayDemo4(array, length);
printf("邵忠棋");
system("pause");
}
不积跬步无以至千里!