您的位置:首页 > 其它

排序算法

2016-02-24 16:22 295 查看

有好多种排序方法

选择排序

快速排序

冒泡排序

插入排序

等等

选择排序

基本思想:

假设排序表为L[1…n],第i趟排序从表中选择关键字最小的元素与Li交换,第一趟排序可以确定一个元素的最终位置,这样经过n-1趟排序就可以使得整个排序表有序。

代码:

- void SelectSort(ElemType arr[], int length)
{
int i, j, min;
ElemType tmp;

for (i = 0; i < length - 1; ++i) // 需要n-1趟
{
min = i;

for (j = i + 1; j < length; ++j)
{
if (arr[j] < arr[min]) // 每一趟选择元素值最小的下标
{
min = j;
}
}

if (min != i) // 如果第i趟的Li元素值该趟找到的最小元素值,则交换,以使Li值最小
{
tmp = arr[i];
arr[i] = arr[min];
arr[min] = tmp;
}
}
}


快速排序

基本思想:

基于分治法,在待排序的n个元素中任取一个元素pivot作为基准,通过一趟排序将待排序表划分为独立的两部分L[1..k-1]和L[k+1 .. n],使得第一部分中的所有元素值都小于pivot,而第二部分中的所有元素值都大于pivot,则基准元素放在了其最终位置L(K)上,这个过程为一趟快速排序。而后分别递归地对两个子表重复上述过程,直到每部分内只有一个元素或为空为止,即所有元素都放在了其最终位置上。

代码:

- int Partition(ElemType arr[], int left, int right)
{
ElemType pivot = arr[left]; // 以当前表中第一个元素为枢轴值

while (left < right)
{
// 从右向左找一个比枢轴值小的元素的位置
while (left < right && arr[right] >= pivot)
{
--right;
}

arr[left] = arr[right]; // 将比枢轴值小的元素移动到左端

// 从左向右查找比枢轴值大的元素的位置
while (left < right && arr[left] <= pivot)
{
++left;
}

arr[right] = arr[left];// 将比枢轴值大的元素移动到右端
}

arr[left] = pivot; // 将枢轴元素放在最终位置

return left;
}

- void QuickSort(ElemType arr[], int left, int right)
{
if (left < right)
{
int pivotPos = Partition(arr, left, right); // 划分
QuickSort(arr, left, pivotPos - 1); // 快速排序左半部分
QuickSort(arr, pivotPos + 1, right); // 快速排序右半部分
}
}


冒泡排序

基本思想:

假设待排序的表长为n, 从后向前或从前向后两两比较相邻元素的值,若为逆序,则交换之,直到序列比较完。这样一回就称为一趟冒泡。这样值较大的元素往下“沉”,而值较小的元素入上“浮”。

结果展示:

/*冒泡排序 分析详解:

原始数据: 28, 30, 19, 2, 23

第一趟:

第一次:28, 30, 19, 2, 23

第二次:28, 19, 30, 2, 23

第三次:28, 19, 2, 30, 23

第四次:28, 19, 2, 23, 30

第二趟:

第一次:19, 28, 2, 23, 30

第二次:19, 2, 28, 23, 30

第三次:19, 2, 23, 28, 30

第三趟:

第一次:2, 19, 23, 28, 30

第二次:2, 19, 23, 28, 30

第四趟:

第一次:2, 19, 23, 28, 30

*/


代码:

void BubbleSort(ElemType arr[], int length)
{
int i, j;
ElemType tmp;

for (i = 0; i < length - 1; ++i)// 趟次
{
for (j = i + 1; j < length; ++j)
{
if (arr[i] > arr[j])
{
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
}


插入排序

基本思想:

将等排序列划分为有序与无序两部分,然后再依次将无序部分插入到已经有序的部分,最后就可以形成有序序列。

操作步骤:

1)查找出元素L(i)在表中的插入位置K;

2)将表中的第K个元素之前的元素依次后移一个位置;

3)将L(i)复制到L(K)。

代码:

-(void)insertSortWithArray:(NSArray *)aData{
NSMutableArray *data = [[NSMutableArray alloc]initWithArray:aData];
for (int i = 1; i < [data count]; i++) {
id tmp = [data objectAtIndex:i];
int j = i-1;
while (j != -1 && [data objectAtIndex:j] > tmp) {
[data replaceObjectAtIndex:j+1 withObject:[data objectAtIndex:j]];
j--;
}
[data replaceObjectAtIndex:j+1 withObject:tmp];
}
NSLog(@"插入排序后的结果:%@",[data description]);
[data release];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: